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之入门(三)序列
May 25 Python
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
Python中特殊函数集锦
Jul 27 Python
Python 调用Java实例详解
Jun 02 Python
Python中input与raw_input 之间的比较
Aug 20 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
Python3处理HTTP请求的实例
May 10 Python
python 根据时间来生成唯一的字符串方法
Jan 14 Python
Python微信操控itchat的方法
May 31 Python
Python3安装pip工具的详细步骤
Oct 14 Python
Python叠加矩形框图层2种方法及效果
Jun 18 Python
Python办公自动化解决world文件批量转换
Sep 15 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二维数组的去重问题解析
2011/07/17 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
PDO::getAttribute讲解
2019/01/28 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
2007/01/09 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
Python性能优化的20条建议
2014/10/25 Python
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
python实现12306火车票查询器
2017/04/20 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
历史系毕业生自荐信
2013/10/28 职场文书
高三高考决心书
2014/03/11 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
工资证明格式模板
2015/06/12 职场文书
初三数学教学反思
2016/02/17 职场文书
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS