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中__call__用法实例
Aug 29 Python
python根据时间生成mongodb的ObjectId的方法
Mar 13 Python
解决uWSGI的编码问题详解
Mar 24 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
Python玩转PDF的各种骚操作
May 06 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
Python偏函数实现原理及应用
Nov 20 Python
python爬虫基础之urllib的使用
Dec 31 Python
Python与C/C++的相互调用案例
Mar 04 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获得url参数中具有&amp;的值的方法
2014/03/05 PHP
万能的php分页类
2017/07/06 PHP
js 操作符实例代码
2009/10/24 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
jQuery获取table行数并输出单元格内容的实现方法
2016/06/30 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
python3+PyQt5实现柱状图
2018/04/24 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
差生评语大全
2014/05/04 职场文书
城管大队整治方案
2014/05/06 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis