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 30 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
python numpy存取文件的方式
Apr 01 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 Python
用python3读取python2的pickle数据方式
Dec 25 Python
深入浅析python的第三方库pandas
Feb 13 Python
python随机模块random的22种函数(小结)
May 15 Python
Python列表推导式实现代码实例
Sep 09 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生成月历代码
2007/06/14 PHP
PHP中strtotime函数使用方法详解
2011/11/27 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
wxPython 入门教程
2008/10/07 Python
详解Django中的权限和组以及消息
2015/07/23 Python
Python网络编程详解
2017/10/31 Python
python代码实现ID3决策树算法
2017/12/20 Python
python调用百度语音REST API
2018/08/30 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
新党章心得体会
2014/09/04 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
创卫工作总结2015
2015/04/22 职场文书
离婚律师函范本
2015/05/27 职场文书
团组织推荐意见
2015/06/05 职场文书
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android