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中命名空间的查找规则LEGB
Aug 06 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 Python
python绘制圆柱体的方法
Jul 02 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
python图像处理入门(一)
Apr 04 Python
Python yield的用法实例分析
Mar 06 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 Python
django中cookiecutter的使用教程
Dec 03 Python
编写python程序的90条建议
Apr 14 Python
Python中rapidjson参数校验实现
Jul 25 Python
Python 数据可视化之Matplotlib详解
Nov 02 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
关于PHP5 Session生命周期介绍
2010/03/02 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
django中的ajax组件教程详解
2018/10/18 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
js判断节假日实例代码
2017/12/27 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
python django 增删改查操作 数据库Mysql
2017/07/27 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
python 实现A*算法的示例代码
2018/08/13 Python
python实现简单登陆系统
2018/10/18 Python
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
人力资源管理专业学生自我评价
2013/11/20 职场文书
搞笑获奖感言
2014/01/30 职场文书
作文评语大全
2014/04/23 职场文书
幼儿园开学通知
2015/04/24 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL