最近在看Python基础,遇到了八皇后问题,看得整个人晕晕乎乎,甚至开始怀疑人生。

问题是在一个8*8的国际象棋棋盘上摆放8个皇后,问题一是找出一个解,问题二是问有多少个解。这里我把我自己的理解写出来,只针对最后一个落子的情况,不涉及递归,希望能有所帮助。

首先定义冲突函数:

def conflict(state,nextQueenColumnIndex):

#state是当前已经放置的皇后在棋盘上面的列索引组成的元组,nextQueenColumnIndex是将要放置的下一个皇后(简称A)的列索引,这里关键问题在于要将A与之前放置的皇后一一比对,找出是否会被吃掉(存在冲突),因此需要做循环,之前已经放置的皇后个数当然是len(state),因为索引是从0开始算的,所以已经放置的最后一个皇后的行索引为len(state)-1,因此A的行索引为len(state)。

nextQueenRowIndex=len(state)

for everyqueen in range(nextQueenRowIndex):

#注意range右边是开区间,取出每一行等行索引。

if abs(state[everyqueen]-nextQueenColumnIndex) in (0,nextQueenRowIndex-everyqueen):

#,这里需要明白的是,假如state为(0,1,2,3),那么代表的是第一行皇后列索引为0,第二行皇后列索引为1,以此类推。那么state[everyqueen]实际上就是取出了每一行皇后的列索引。

return True

return False

#这里有两个关键点,第一、是abs(state[everyqueen]-nextQueenColumn)==0检查A是否与其他皇后在同一列,abs(state[everyqueen]-nextQueenColumn)==nextQueenRowIndex-everyqueen检查A是否与其他皇后在一条斜线上(对角线),其实就是行索引-行索引==列索引-列索引就代表在一条斜线上面。第二、注意return False是与for对齐的,因为只要存在冲突就会return True,当for循环执行完后都没有return的话,那么就会执行到return False,也即不存在冲突,那么A落在这个棋盘点就是对的!

以上,冲突函数就写完了。

然后,我们来写主函数

def MyQueen(state,queencount):

#state依然代表当前已经放置的皇后在棋盘上面的列索引组成的元组,queencount代表皇后的总数(包括已有的和准备下的),下面讨论的是最简单的一种情况,就是已知棋盘的状态,需要下最后一颗子。

if len(state)==queencount-1#len(state)代表已落子的个数,如果与总数-1相等的话,那么我们要下的必然是最后一颗子。这最后一颗子怎么下?当然是要与前面的每一行的皇后做冲突比对,好在我们的冲突函数已经写好了,可以直接用。

for n in range(queencount):取出每一列的列索引,其实就是说在当前棋盘状态下,落子第一列行不行?落子第二列行不行?。。。落子最后一列行不行?其实这里的range(queencount)只是方便我们按次序取出1,2,3,4,5。。。,因为要注意这道题的前提是棋盘是真方形,是在N*N的棋盘上面放置N个皇后,因此我们这里直接用queencount比较方便,当然如果你已经知道棋盘大小为8或者16直接用range(8)或者range(16)也行。

if not conflict(state,n):#n就是要落子的列索引

print(n)

#输出的n就是A的列索引了,也即最后一个皇后落子的棋盘列索引位置。

Over,上面就讨论了八皇后问题中落最后一颗子的简单情况,当然是用这个函数的前提是要知道棋盘的当前落子状态及皇后的总数,我目前刚把这个看懂,写出来,也为自己加深印象,后面的还要继续学习。。。

python8皇后不攻击问题_Python八皇后问题(落最后一颗子)相关推荐

  1. python8皇后不攻击问题_python 八皇后问题的解法(深度搜索)

    共本文介绍如何用深度搜索的方式求解8皇后(其实也可以求解N皇后)问题的解 八皇后问题描述 在国际想起的规则中,皇后能攻击八个方向上的棋子,而且不受距离限制. 皇后的攻击方向如下图所示: 八皇后问题则是 ...

  2. Java黑皮书课后题第7章:***7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行、同列、同一对角线)。编写程序显示一个解决方案

    7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行.同列.同一对角线).编写程序显示一个解决方案 题目 题目描述 破题 题目 题目描述 ...

  3. 八皇后加强版:每个皇后最多攻击一个其它的皇后

    想必搞OI/ACM的朋友都应该知道八皇后问题,这是学习编程的必修课程之一:在国际象棋棋盘上最多可以放置多少个互不攻击的皇后(皇后可以攻击它所在的行.列.对角线方向上的棋子)?显然,能够放置的皇后数不超 ...

  4. 八皇后问题python实现_八皇后问题的python实现

    以前写的一个八皇后问题求解,思路就是每次循环列出所有的可能解,然后过滤出不符合要求的解.详细见代码: //检查两个点是否在攻击线上 def attack(p1,p2): return p1[0]==p ...

  5. 你知道八皇后嘛?就是那个八皇后

    说起八皇后,其实这是一个古老而著名的问题.该问题是19世纪著名的数学家高斯1850年提出:在一个8*8国际象棋盘上,有8个皇后,每个皇后占一格:要求皇后之间不会出现相互"攻击"的现 ...

  6. 88皇后问题C语言程序设计,八皇后问题--C语言程序设计.pdf

    八皇后问题 学 2012年 9 月 5 日 目录 一.选题 1.1背景知识---------------------------2 1.2设计目的与要求------------------------ ...

  7. java中经典八皇后难题_Java实现经典八皇后的问题

    今天自己实现了八皇后的问题,其实代码并不长,但是关于虚拟机中怎样实现的想了好长时间特别是红色部分.现在还是有点不是很明白.代码如下,已经实现运行. public class EightQueen { ...

  8. 八皇后问题c语言循环,八皇后问题的12组解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #define N 8 /*皇后数*/ typedef int bool; rot(char d[ ],char s[ ...

  9. C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题

    C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...

最新文章

  1. python爬虫之Scrapy框架的post请求和核心组件的工作 流程
  2. 【NLP】Doc2vec原理解析及代码实践
  3. MVC添加控制器时提示无法检索“MyContosoUniversity.Models.Student”的元数据
  4. JavaScript等同于printf / String.Format
  5. 比“花书”更合适入门者的“鱼书”
  6. LED的基本操作(138译码器 573锁存器)
  7. 会让你变得与众不同的22个技巧
  8. 9.10教师节 Best wishes to teachers
  9. 最新中国移动光猫改桥接方式(中兴ZXHN F663NV9)地域:贵州 适用于动态超密
  10. 我与朗科不得不说的那些事儿
  11. 【图】女孩暴雨中为残疾乞丐撑伞引热议
  12. 李开复操刀的创新奇智敲钟在即,亏了11个亿的公司为何还能获得国家和市场的双重认可?...
  13. 端口转发工具--lcx
  14. 【双足轮机器人】SK8O技术详解--(1)摘要和介绍【翻译】
  15. 2022 CCF中国开源大会—开放原子开源创新发展论坛顺利举办!
  16. 身临其境文化之旅——VR全景图片畅游世界各地文化景点
  17. 脑电EEG静息态数据重新分段
  18. 创业公司为什么不自建MySQL而使用阿里云的 RDS
  19. java计算机毕业设计高校共享单车管理系统(附源码、数据库)
  20. Linux - 第8节 - 进程信号

热门文章

  1. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射
  2. 程序员自家种水果,新鲜包邮配送!
  3. .NET Core 3.0之深入源码理解HttpClientFactory(二)
  4. 从严治码-系统集成项目之根本
  5. .NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI
  6. 2016.NET Core相关内容回顾
  7. JWT【JSON Web Token】 简述
  8. mysql 一主一备_Mysql一个主一备
  9. 【错误异常大全】:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS
  10. LeetCode之Fizz Buzz