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爬取Coursera课程资源的详细过程
Nov 04 Python
Eclipse中Python开发环境搭建简单教程
Mar 23 Python
python 创建弹出式菜单的实现代码
Jul 11 Python
python通过opencv实现批量剪切图片
Nov 13 Python
pycharm安装和首次使用教程
Aug 27 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
python的debug实用工具 pdb详解
Jul 12 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
python Tornado框架的使用示例
Oct 19 Python
Python使用openpyxl批量处理数据
Jun 23 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/05/31 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
Ruby元编程基础学习笔记整理
2016/07/02 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
详解Python 切片语法
2019/06/10 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
酒店管理专业学生求职信
2013/09/27 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
请假条范文大全
2014/04/10 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
办理护照工作证明
2014/10/10 职场文书
财务人员个人工作总结
2015/02/27 职场文书
被告代理词范文
2015/05/25 职场文书