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操作MySQL简单实现方法
Jan 26 Python
Python实现从订阅源下载图片的方法
Mar 11 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
Python 多线程Threading初学教程
Aug 22 Python
你真的了解Python的random模块吗?
Dec 12 Python
python pandas修改列属性的方法详解
Jun 09 Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 Python
python基于C/S模式实现聊天室功能
Jan 09 Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
python matplotlib拟合直线的实现
Nov 19 Python
Django一小时写出账号密码管理系统
Apr 29 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 快速生成 Flash 动画的方法
2007/03/06 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
PHP静态成员变量
2017/02/14 PHP
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
2019/09/25 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
Django中的CACHE_BACKEND参数和站点级Cache设置
2015/07/23 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2019/10/27 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
Pytorch转tflite方式
2020/05/25 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
大学生志愿者感言
2014/01/15 职场文书
2014年人大工作总结
2014/12/10 职场文书
研讨会致辞
2015/07/31 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
Java设计模式之代理模式
2022/04/22 Java/Android
python计算列表元素与乘积详情
2022/08/05 Python