c语言八皇后问题经典算法,经典算法之八皇后问题

article/2025/9/10 16:36:33

八皇后问题是一个古老而又著名的问题,是学习回溯算法的一个经典案例。今天我们就一起来探究一下吧!

281b5ded3310fc3c56792f1fb3134987.png

时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题,

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。

后面陆续有不同的学者提出自己的见解。大数学家高斯认为一共有76种摆法,1854年在柏林的象棋杂志上不同的作者发表了共计40种不同的见解,后来还有人利用图论的方法得出共有92种摆法。

而如今,通过我们的计算机以及编程语言我们可以轻松的解决这个问题。

最直接的也是最容易想到的一种解法便是暴力法,我们可以在8×8的格子中任选8个皇后,选定后看是否满足任意两个皇后都不处于同行同列同斜线的条件,若满足则累计满足条件的方案。学习过排列组合的我们发现64取8这个数字达到了40亿,显然是令人难以接受的。

43642355dfaa568537da63d5cc12cc08.png

但我们根据这个条件,我们可以人为地做出一些选择,比如根据条件我们可知每行每列最多都只能有一个皇后,这样可以在一定程度上缩减问题的规模。在第一行的某一列选择放置一个皇后,共有8种不同的选择,而第二行只能选择剩下的7列,也就是7种选择,剩下每一行的选择都会递减1,那么总共可供选择的方案有8的阶乘种,已经是一种远优于暴力解法的解法,但是这个阶乘的时间复杂度恐怕也难以令人接受,还有更优的解法吗?

4708f5bf47bbf9c95c71682c459177f8.png

那是自然的,这便是递归回溯的方法。

当我们选择了第一个皇后的位置之后,与其处于同行同列同斜线的位置便都无法被选择,第二个皇后只能放在未被第一个皇后所辐射到的位置上,接着放置第三个皇后,同样不能放在被前两个皇后辐射到的位置上,若此时已经没有未被辐射的位置能够被选择,也就意味着这种摆法是不可行的,我们需要回退到上一步,给第二个皇后重新选择一个未被第一个皇后辐射的位置,再来看是否有第三个皇后可以摆放的位置,如还是没有则再次回退至选择第二个皇后的位置,若第二个皇后也没有更多的选择则回退到第一个皇后,重新进行位置的选择。

ff6507864e7688a359293681c1a66e3d.png

整体的方法便如上所述,下面用直观的代码来实现这个算法,

def find_Queen(row):

if row>7:

global count

count+=1

print_queen()

return

for column in range(8):

if check(row,column):

Queen[row][column]=1

find_Queen(row+1)

Queen[row][column]=0

定义一个二维数组Queen,数组中相应位置为1则表示该位置放置皇后,按行来摆放皇后的位置,如果当前选择没法继续往下找到皇后的放置位置,则将之前置为1的重新置为0,也就是回退。而check函数的主要目的是为了筛选皇后的合适位置以满足条件。具体可以分为三块,行列检查,主对角线以及负对角线检查。

def check(row,column):

# 检查行列

for k in range(8):

if Queen[k][column]==1:

return False

# 检查主对角线

for i,j in zip(range(row-1,-1,-1),range(column-1,-1,-1)):

if Queen[i][j]==1:

return False

# 检查副对角线

for i,j in zip(range(row-1,-1,-1),range(column+1,8)):

if Queen[i][j]==1:

return False

return True

当已经放置了八个皇后时,进入 if 语句,累计数值并且打印出相应的皇后摆放示意图。

facd78df99172a1df67d9e6b351ac488.png

实体的星星表示当前位置摆放了皇后,而具体的打印代码如下所示,

def print_queen():

print(Queen)

for i in range(8):

for j in range(8):

if Queen[i][j]==1:

print('☆ '*j+'★ '+'☆ '*(7-j))

print("\n\n")

这样,通过递归回溯的办法,我们找到了八皇后的92种解,并且以形式化的方法打印了出来。通过对八皇后问题的学习,我们可以深刻体会到回溯的思想~


http://chatgpt.dhexx.cn/article/7X8uR68x.shtml

相关文章

从八皇后问题思考回溯法

一、八皇后问题 八皇后是经典的回溯法问题,题目是说将八个皇后,放到88的国际象棋棋盘中中,使得任意两个皇后都不能在同一行、同一列以及同一条对角线上。下图是一个四皇后的搜索示意图。 八皇后问题可以通过暴力法求解,代码也很…

八皇后问题(Python)

一.问题简介 八皇后问题: 如何能在 8*8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了到达此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 二.几种思路和方法 1.回溯法递归思想 如图所…

八皇后问题详解(四种解法)

所有源码都在github上(https://github.com/seasonyao/eight_queen_question) 如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问题,最后一句“计算机发明后就有一万种方式解决这个问题”读起来也让程序猿们很快活。闲话少说,开始阐述我的思路: 最…

八皇后问题

八皇后问题 八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯贝瑟尔于1848年提出的问题,是回溯算法的典型案例。 问题表述为:在88格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或…

八皇后问题(适合初学者的写法)C语言

什么是八皇后问题: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于1848年提出:在88格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能…

八皇后问题,秒懂递归回溯(有图详解|c语言)

目录 👸🏻前言 👸🏻题目介绍 👸🏻引入: 👸🏻解决思路: 👸🏻理论存在,实践开始! 👸&#x1f…

利用ngrok实现域名映射局域网ip

前言 相信很多开发者都有这样的需求,需要让外网访问你本地的服务器,方便调试本地代码,或者让别人体验到自己做的应用。那么这时,我们需要做的就是将我们本地的端口映射到一个外网的端口上,也就是内网穿透。常见的解决…

python调用手机摄像头,实现实时调用摄像头,需要你的电脑和手机在同一个局域网内

1、android手机上安装一款APP:IP摄像头,app的图片如上图 2.调用代码如下 import cv2cv2.namedWindow("camera", 1) # 开启ip摄像头 video "http://admin:admin10.0.0.32:8081/" # 此处后的ipv4 地址需要改为app提供的地址 cap c…

02、处于不同局域网下的Socket通信(网络部分理论知识)

目录 一、服务器 1、服务器的种类和功能 2、服务器的操作系统 3、IIs、Apache、Tomcat 4、云服务器 弹性云服务器(Elastic Cloud Server,ECS) 云服务器安全组 二、OSI七层模型与TCP/IP五层模型 三、外网、内网、公网、私网 内网穿透…

使用wireshark抓取聊天信息(局域网内的udp通信)

文章目录 1,实验目的2,实验操作3,总结4,附件 1,实验目的 1.分析这程序所采用的是udp还是tcp 2.在抓取包中找到窃取到的聊天信息 (英文字符和汉字可能经过了某种编码转换,数据包中不是明文) 3.如果是网络连…

安装黑群晖找不到局域网电脑_黑群晖洗白太复杂?我用蒲公英P5轻松实现

前言: 随着网盘时代的结束,剩下的网盘供应商又开启了垄断方式,所以越来越多的小伙伴开始自己组自己的家庭NAS网络存储服务器。比如笔者的一个好基友就是如此。其实开始笔者是想让他直接一步到位,买群晖或者铁威马的NAS,在放入硬盘就可“一劳永逸”。然而,这个小伙伴看到了…

内网穿透实现局域网内搭建私服务器

使用云服务器实现内网穿透。内网里建立一台老旧win机专门用来挂pt,在上面存储视频和软件,而后映射在外网中,通过手机和电脑随时随地的下载和在线观看win机上的视频和文件。 1、修改ssh的默认端口 在公网中使用常用软件的默认端口会导致自己的…

局域网终结者_p2p终结者怎么安装使用 p2p终结者安装使用方法【介绍】

p2p终结者是一款局域网控制软件,他的主要功能就是控制和限制同一个局域网内其它的上网用户,如限制不让别人上QQ,不让别人开网页和不让别人下载,只要他和你在同一网之内你就可以控制他,并且神奇的是,不需要动…

Kali Linux-MSF远控局域网手机

前言 严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。 本文目的:演示如何借助Kali Linux系统的Metasploit渗透测试框架生成远程控制程序,然后感染局域网内的Android手机,从而实现对目标手机数据的读取、音频的…

超级眼局域网监控软件 员工禁止软件 可以控制时间段

第一步: 下载超级眼局域网监控软件: 将经理端安装在管理者的电脑上,员工端安装在需要被监控者的电脑上。 第二步:在经理端电脑上操作。打开管理端软件,扫描所有的被控电脑。然后选择需要管理的电脑(可以全选…

Kali使用Netdiscover探测局域网中存活主机

1、netdiscover介绍 Netdiscover 是一个主动/被动的ARP 侦查工具。使用Netdiscover工具可以在网络上扫描IP地址,检查在线主机或搜索为它们发送的ARP请求。 2、 主动模式:主动模式顾名思义就是主动的探测发现网络内主机,但是这种方式往往会引起网络管理员的注意。 打开Kali终…

如何避免计算机被别人共享,win7如何防止别人偷窥电脑 win7防止别人偷窥电脑操作方法...

我们都知道在win7系统中,可以设定开机密码或者屏保密码来防止我们的电脑被别人使用,不仅win7系统可以设置开机密码或者屏保密码,其他版本的系统也是可以设置的,那么win7如何防止别人偷窥电脑呢?下面为大家介绍win7防止别人偷窥电…

【时间之外】监控你的电脑只需8步

最近某安全厂商很火,很多离职员工都是被这套系统抓出来的。其实原理很简单,本文就用很多人都用过的kali系统,告诉你,想要控制你的电脑有多简单! 网上的文章很多,如这篇,Kali攻防,写…

详细介绍别人电脑访问到自己电脑运行的项目

文章目录 让别人远程访问你的代码网站项目或临时演示你的项目给客户的方式详解 引言一、创建一个你想要别人访问的项目二、明确你想要将这个网站或者项目存放的地方 终端分类服务器设备WEB服务器三、部署我们的网页 本地部署流程进入浏览器输入网址访问获取本机的IP地址&#…

监控手机屏幕、监控电脑屏幕方案

一&#xff1a;手机投屏 实时监控多个手机屏幕&#xff08;<3台&#xff09; ApowerMirror软件&#xff0c;终生179&#xff0c;可同时连接3部手机 网络环境&#xff1a;电脑与测试手机需要在同一个WiFi网络环境下。(要求手机型号不同) 软硬件环境&#xff1a;电脑和手机分别…