本文为大家分享了python八皇后问题的解决方法,供大家参考,具体内容如下

题目:

给定一个 N*N 正方形棋盘,在上面放置 N个棋子,又叫皇后,使每两个棋子都不在同一条横线上、竖线上、斜线上。一般我们都讨论8皇后,但是只要N > 4,都会存在解的。

分析:

方法1:根据定义来处理,即每往棋盘中放置皇后的时候,都要判断哪些位置可以放新加入的皇后,而哪些地方如果放置皇后的话,会造成冲突。我下面写的这个代码就是基于此。

方法2、我看了下别人的优化,主要是采用位运算来实现计算复杂度降低的,我没有用Python 实现这个,所以在这里挖一个坑。

代码:

代码里的注释有详细的说明,设定N值,即可返回一个符合要求的解。但是这个问题还有一个进阶,那就是讨论究竟会有多少个解,这就需要数论的知识了,而且我对这块数学没研究过,所以也没有代码实现。大家将就使用一下代码就好了。

class EightQueensPuzzle(object):

'''

八皇后问题求解

代码使用方法:

eight_q = EightQueensPuzzle(4, 5)

print "EIGHT QUEEDS PUZZLE:"

result = eight_q.eight_queens_puzzle()

for i in result:

print i

'''

def __init__(self, n, char):

self.n = n # 棋盘维度

self.char = char # 皇后标记字符

def init_chess_board(self, n):

'''

初始化一个棋盘,棋盘规格可以按参数 n 随意选定,一般都讨论八皇后,就选择 8

:return: 返回棋盘,是一个 8*8 矩阵

'''

chess_board = []

for i in xrange(0, n):

line = []

for j in xrange(0, n):

line.append(0)

chess_board.append(line)

return chess_board

def update_conflict_board(self, conflict_board, position):

for k in xrange(0, self.n): # 为行添加 1

conflict_board[position[0]][k] = 1

for id in xrange(position[0]+1, self.n):

conflict_board[id][position[1]] = 1 # 为列添加 1

if position[0] + position[1] - id >= 0: # 为左斜添加 1

conflict_board[id][position[0] + position[1] - id] = 1

if position[1] - position[0] + id < self.n: # 为右斜添加 1

conflict_board[id][position[1] - position[0] + id] = 1

def queens_conflict(self, conflict_board, position):

'''

当前棋盘的状态是 conflict_board, 判定如果在 position 位置给一个皇后的话,会不会出现问题。

如果有问题则返回 False,如果没有问题返回 True

'''

if conflict_board[position[0]][position[1]] != 0:

return False

else:

return True

def eight_queens_puzzle(self):

'''

给出一个八皇后的求解答案。

:return:返回一个结果并打印.

'''

import random

while True: # 不停寻找符合条件的八皇后排列

chess_board = self.init_chess_board(self.n)

conflict_board = self.init_chess_board(self.n)

for i in xrange(0, self.n):

flag = 0

for cnt in conflict_board[i]:

if cnt != 0:

flag += 1

if flag == self.n: # 如果已经1被填满了,说明这个答案错误

break

while True:

pos = [i, random.randint(0, self.n-1)] # 元组构成皇后的位置

if self.queens_conflict(conflict_board, pos): # 如果没有冲突

chess_board[i][pos[1]] = self.char

self.update_conflict_board(conflict_board, pos)

break

if self.char in chess_board[self.n-1]:

return chess_board

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

八皇后问题python_python八皇后问题的解决方法相关推荐

  1. 八皇后问题python_python八皇后问题

    两种方法 第二种方法解释 第一层for表示第一个皇后的位置,然后第二层for表示,循环8次,表示其他皇后的位置,最后限制次数,是if判断 def conflict(state,nextx): '定义冲 ...

  2. python网络爬虫系列(八)——常见的反爬手段和解决方法

    常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因 了解 服务器常反什么样的爬虫 了解 反爬虫领域常见的一些概念 了解 反爬的三个方向 了解 常见基于身份识别进行反爬 了解 常见基于爬虫行为进 ...

  3. 八皇后算法python_Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  4. 八皇后问题python_python求解八皇后问题

    今天突然有个行外的朋友扔了一张图给我,希望我能帮他用python做一下这个作业--八皇后问题. 八皇后问题是一种经典的数学求解问题,规则是在8×8的国际象棋棋盘上,要求在每一行(或者每一列)放置一个皇 ...

  5. 八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现

    对经典算法的问题的回顾与感想 对八皇后问题和八数码问题分别用最陡上升爬山法.首选爬山法.随机重启爬山法.模拟退火算法来实现,并且分析他们的性能. 分析 要求实现的各个算法是有共同点的,比如,八皇后问题 ...

  6. 【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II

    回溯 回溯(Back Tracking) 提出八皇后问题(Eight Queens) 初步思路一:暴力出奇迹 初步思路二:根据题意减少暴力程度 初步思路三:回溯法(回溯+剪枝) 四皇后 - 回溯法图示 ...

  7. 爬山法、随机重启爬山法、模拟退火算法对八皇后问题和八数码问题的性能测试...

    代码地址:https://github.com/laiy/AI/tree/master/awesome-search 一些前提: 1. 首先要明确这些算法并不是用于解决传统的搜索问题的(环境是可观察的 ...

  8. java 八皇后问题以及N皇后问题

    想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答.也可以扫描下面的二维码关注 八皇后的来源 八皇后问题是一个以国际象棋为背景的问题:如何能够 ...

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

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

最新文章

  1. Oculus推出近场HRTF和立体声源,将打造真正身临其境的VR体验
  2. jeecg 查看 页面 父子表 横向滚动条效果 官方被禁用
  3. PyTorch 1.0 中文文档:torch.sparse
  4. syncthing下载_Syncthing中继服务器和发现服务器
  5. jmeter之JDBC类组件
  6. 拖动布局之保存布局页面
  7. 【转】ZooKeeper详细介绍和使用第一节
  8. [PHP] 数据结构-二叉树的创建PHP实现
  9. 计算机桌面黑屏时间,您必须等待至少一分钟,计算机才能将屏幕保护程序设置为使计算机黑屏...
  10. 欧姆龙NX1P控制器及ST编程
  11. 元宇宙的车,迷你世界上不了
  12. rtt segger 低功耗模式_Segger RTT使用注意事项
  13. 【Python机器学习】梯度下降法(三) 优矿(uqer.io)
  14. 零差检测,外差检测 以及 激光雷达中的零差探测和外差探测
  15. python小世界网络生成
  16. SIGIR'22 | 阿里 ESCM^2: 升级版全空间多任务转化率预估
  17. Redis(持久化、主从复制、主从切换、twemproxy、redis集群)
  18. Attribute 特性详解
  19. python手持弹幕LED滚动字幕
  20. js 中 throttle 的实现

热门文章

  1. linux就业技术指导,学linux前景怎么样
  2. 【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)
  3. 安防摄像头Onvif、RTSP、GB28181转web无插件直播卡顿分析
  4. mongodb 2php 操作
  5. 你所不了解的五条面试忠告
  6. HDU1023 Train Problem II
  7. CABasicAnimation
  8. 带给你灵感的3D街画艺术设计
  9. Js实现异步刷新(原创)
  10. 【数据结构与算法】字符串匹配 AC自动机