八皇后问题(Python)

article/2025/9/10 16:59:19

一.问题简介

八皇后问题: 如何能在 8*8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了到达此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

二.几种思路和方法

1.回溯法+递归思想

 如图所示,圆圈代表皇后所放的位置,这里如果将棋盘转化为二维矩阵进行遍历比较麻烦,考虑到棋盘的每一行不能同时存在一个以上的皇后,所以将棋盘转化为一个具有八个元素的列表,而皇后的位置(i,j)对应的是列表中(元素的索引值,元素的值),因此放置皇后的操作变成了在列表中的每个位置填值操作,很明显的一个条件是列表中不能有相同的值。图中给出的是某一种情形

接下来直接看代码:

首先是定义一个queen函数,作用就是用来放皇后的位置。然后进入到第一个判断条件:如果当前行的位置遍历到“第9行”,即全部遍历完之后,将所有的结果放入到列表list中;然后是进入循环,在每一行的八个列的位置遍历,如果满足check中所有条件,那么直接递归调用,进入下一行遍历。

check函数:【任两个皇后都不能处于同一条横行】这一条件已经在前面保证成立了,这里只需保证剩下的两个条件【同一条纵行】和【同一条斜线】成立即可。注意:当两个皇后的位置坐标的连线斜率的绝对值为1,则这两个皇后在同一直线上。

def check(self, list, row):for i in range(row):if list[i] == list[row] or abs(list[row] - list[i]) == abs(row - i):return Falsereturn True
def queen(self, list, row, n):  # list为存储的结果;row是当前行;n为棋盘大小x=[]if row == n:x.extend(list)self.solves.append(x)returnfor i in range(n):  # 这里的i指的是所在列的值list[row] = iif self.check(list, row):self.queen(list, row + 1, n)

下面是完整代码:

导包:

import numpy as np           # 提供维度数组与矩阵运算
import copy                  # 从copy模块导入深度拷贝方法
from board import Chessboard

棋盘类的初始化

# 初始化8*8八皇后棋盘
chessboard = Chessboard()

# 基于棋盘类,设计搜索策略
class Game:def __init__(self, show = True):"""初始化游戏状态."""self.chessBoard = Chessboard(show)self.solves = []self.gameInit()# 重置游戏def gameInit(self, show = True):"""重置棋盘."""self.Queen_setRow = [-1] * 8self.chessBoard.boardInit(False)def check(self, list, row):for i in range(row):if list[i] == list[row] or abs(list[row] - list[i]) == abs(row - i):return Falsereturn Truedef queen(self, list, row, n):  # list为存储的结果;row是当前行;n为棋盘大小x=[]if row == n:x.extend(list)self.solves.append(x)returnfor i in range(n):  # 这里的i指的是所在列的值list[row] = iif self.check(list, row):self.queen(list, row + 1, n)def run(self, row=0):#self.solves.append([0, 6, 4, 7, 1, 3, 5, 2])n = 8list = [0 for _ in range(n)]self.queen(list,row,n)def showResults(self, result):"""结果展示."""self.chessBoard.boardInit(False)for i,item in enumerate(result):if item >= 0:self.chessBoard.setQueen(i,item,False)self.chessBoard.printChessboard(False)def get_results(self):"""输出结果.return: 八皇后的序列解的list."""self.run()return self.solves

验证一下结果:

game = Game()
solutions = game.get_results()
print('There are {} results.'.format(len(solutions)))
game.showResults(solutions[0])

 可以直接输出所有的结果(92种):

print(solutions)

2.排列组合的思想

在上面的基础上,可以稍微转化一下思路,放置不同的皇后位置就是将不同的八个元素的作排列组合问题,然后只要再保证“不在同一斜线”这个条件就可以了。下面是代码:

list1=[0,1,2,3,4,5,6,7]
result=[]
final_result=[]
from itertools import  permutations  #permutations函数:可以对集合或字符串进行排序或排列的所有可能的组合
for i in permutations(list1,8):      result.append(i)               #转化为排列组合问题,result存储部分可能的结果      #下面只需要从result中找出满足‘任一两个皇后不在同一斜线上’的结果
for i in result:n=0                  #n用以标记那些满足条件的结果;for j in enumerate(i):for m in enumerate(i):if  m!=j and abs(m[0]-j[0])==abs(m[1]-j[1]):  #m!=j是避免对同一个坐标位置进行判断n+=1                                       #只要有两个坐标的连线斜率为1,n就不为0if n==0:final_result.append(i)                                print(len(final_result))
print(final_result)

3.遗传算法

基本原理和步骤   

        遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,增加适应度函数值高的解。这样进化N代后就很有可能会进化出适应度函数值很高的个体。

其计算步骤如下:

(1) 编码:将问题空间转换为遗传空间;

(2)创建初始种群:随机生成P 个染色体作为初始种群;

(3)适应度计算:染色体评价,计算各个染色体的适应度;

(4)选择操作:根据染色体适应度,按选择算子进行染色体的选择;

(5)交叉操作:按交叉概率进行交叉操作;

(6)变异操作:按变异概率进行变异操作;

(7)返回(4)形成新的种群,继续迭代,直到满足终止条件。

 

具体实现代码部分还在写,以后有机会在续上吧。

觉得不错的话,大家给个关注给个赞吧!


http://chatgpt.dhexx.cn/article/4VDxTpCo.shtml

相关文章

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

所有源码都在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;电脑和手机分别…

基于VC++的局域网内主机监控系统设计与实现

局域网内主机监控系统 目录 引言 2 1.1 编写目的 2 1.2 项目背景 2 1.3 课题内容和要求 3 1.4 名词解释 4 参考文献 4需求分析 5 2.1 现有系统概述 5 2.2 对新系统的要求 5 2.3 系统要求 6 2.4 对功能的规定 6 2.5 对性能的规定 6 2.6 运行环境规定 7 2.6.2 软件配置 7系统架…

同一个局域网之内,如何远程控制对方的电脑而且不用对方同意

条件&#xff1a; 1、同一个局域网之内&#xff1b; 2、远程控制对方电脑&#xff1b; 3、不用对方做任何操作&#xff08;QQ远程控制需要对方点击同意才能进行远程&#xff09; 具体操作如下&#xff1a; 一、关闭对方电脑的防火墙 二.允许电脑被对方远程 计算机-属性-远…