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函数帮助查询小工具
Mar 13 Python
Python BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
Python使用while循环花式打印乘法表
Jan 28 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
Python偏函数Partial function使用方法实例详解
Jun 17 Python
python Pexpect模块的使用
Dec 25 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 Python
OpenCV-Python实现轮廓的特征值
Jun 09 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
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
php实现监听事件
2013/11/06 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现excel读写数据
2021/03/02 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
python开发前景如何
2020/06/11 Python
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
最新大学职业规划书范文
2013/12/30 职场文书
世界遗产的导游词
2015/02/13 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫
vue修饰符.capture和.self的区别
2022/04/22 Vue.js