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循环语句
Nov 20 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
python中reader的next用法
Jul 24 Python
python3 爬取图片的实例代码
Nov 06 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
Django之路由层的实现
Sep 09 Python
基于pytorch 预训练的词向量用法详解
Jan 06 Python
python3正则模块re的使用方法详解
Feb 11 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 Python
pytorch 移动端部署之helloworld的使用
Oct 30 Python
python 如何上传包到pypi
Dec 24 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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
python交换两个变量的值方法
2019/01/12 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
python retrying模块的使用方法详解
2019/09/25 Python
pytorch 求网络模型参数实例
2019/12/30 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
在校大学生的职业生涯规划书
2014/03/14 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
初中政治教学工作总结
2015/08/13 职场文书
工程主管竞聘书
2015/09/15 职场文书
幼儿园2016年圣诞活动总结
2016/03/31 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
详解nodejs内置模块
2021/05/06 NodeJs
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js