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的正则表达式re模块的常用方法
Mar 09 Python
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
Python对象的深拷贝和浅拷贝详解
Aug 25 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 Python
Python中static相关知识小结
Jan 02 Python
对Python中Iterator和Iterable的区别详解
Oct 18 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
python实现PCA降维的示例详解
Feb 24 Python
Python多进程编程multiprocessing代码实例
Mar 12 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
Python爬虫代理池搭建的方法步骤
Sep 28 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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
Jquery实现动态切换图片的方法
2015/05/18 Javascript
js获取iframe中的window对象的实现方法
2016/05/20 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
2017/06/29 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
django 多数据库及分库实现方式
2020/04/01 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
html5唤起app的方法
2017/11/30 HTML / CSS
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
同学聚会欢迎辞
2014/01/14 职场文书
大型会议策划方案
2014/05/17 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
小学数学国培研修日志
2015/11/13 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
公司中层管理培训心得体会
2016/01/11 职场文书
六年级数学教学反思
2016/02/16 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP