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调用C语言开发的共享库方法实例
Mar 18 Python
Mac 上切换Python多版本
Jun 17 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
Python实现CNN的多通道输入实例
Jan 17 Python
python实现与redis交互操作详解
Apr 21 Python
keras多显卡训练方式
Jun 10 Python
pycharm中leetcode插件使用图文详解
Dec 07 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中常用的预定义变量小结
2012/05/09 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
python strip()函数 介绍
2013/05/24 Python
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
详解python时间模块中的datetime模块
2016/01/13 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
详解python中的 is 操作符
2017/12/26 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
什么是接口(Interface)?
2013/02/01 面试题
一名毕业生的自我鉴定
2013/12/04 职场文书
母婴店促销方案
2014/03/05 职场文书
小学领导班子对照材料
2014/08/23 职场文书
技术股东合作协议书
2014/12/02 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL