python八皇后问题的解决方法


Posted in Python onSeptember 27, 2018

本文为大家分享了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用来获得图片exif信息的库实例分析
Mar 16 Python
收藏整理的一些Python常用方法和技巧
May 18 Python
Python做简单的字符串匹配详解
Mar 21 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
Python基于递归实现电话号码映射功能示例
Apr 13 Python
Python for循环搭配else常见问题解决
Feb 11 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 Python
python字典和json.dumps()的遇到的坑分析
Mar 11 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
python判断数字是否是超级素数幂
Sep 27 #Python
Flask实现跨域请求的处理方法
Sep 27 #Python
python环形单链表的约瑟夫问题详解
Sep 27 #Python
transform python环境快速配置方法
Sep 27 #Python
python如何求解两数的最大公约数
Sep 27 #Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 #Python
python斐波那契数列的计算方法
Sep 27 #Python
You might like
php foreach循环中使用引用的问题
2013/11/06 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
ajax无刷新动态调用股票信息(改良版)
2008/11/01 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
详解Python if-elif-else知识点
2018/06/11 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
python实现ping命令小程序
2020/12/28 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
个人租房协议书样本
2014/10/01 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
爱心捐助活动总结
2015/05/09 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS