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模块restful使用方法实例
Dec 10 Python
Python中super()函数简介及用法分享
Jul 11 Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 Python
Django添加feeds功能的示例
Aug 07 Python
在django admin中添加自定义视图的例子
Jul 26 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 Python
python实现扫雷游戏
Mar 03 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
浅析Python迭代器的高级用法
Jul 16 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
如何使用PHP中的字符串函数
2006/10/09 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
php中in_array函数用法分析
2014/11/15 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
JavaScript获取Url里的参数
2014/12/18 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
2016/05/10 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
python数据结构之二叉树的建立实例
2014/04/29 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
python一键升级所有pip package的方法
2017/01/16 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
请说出几个常用的异常类
2013/01/08 面试题
毕业生求职简历的自我评价
2013/10/07 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
HDFS免重启挂载新磁盘
2022/04/06 Servers