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实现把数字转换成中文
Jun 29 Python
Python可变参数函数用法实例
Jul 07 Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
python 字典访问的三种方法小结
Dec 05 Python
Python计算IV值的示例讲解
Feb 28 Python
Django models filter筛选条件详解
Mar 16 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
Python如何将模块打包并发布
Aug 30 Python
python爬取音频下载的示例代码
Oct 19 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
python写的一个squid访问日志分析的小程序
2014/09/17 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
python 文件查找及内容匹配方法
2018/10/25 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
文职个人求职信范文
2013/09/23 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
实习单位推荐信
2015/03/27 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
Mysql中存储引擎的区别及比较
2021/06/04 MySQL