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模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
如何实现删除numpy.array中的行或列
May 08 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
代码实例讲解python3的编码问题
Jul 08 Python
python实现机器人卡牌
Oct 06 Python
Python异常模块traceback用法实例分析
Oct 22 Python
pyspark给dataframe增加新的一列的实现示例
Apr 24 Python
Python工程师必考的6个经典面试题
Jun 28 Python
python实现简单遗传算法
Sep 18 Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 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中文分词系统SCWS安装和使用实例
2014/04/11 PHP
php查询内存信息操作示例
2019/05/09 PHP
JavaScript 基础问答三
2008/12/03 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
儿童编程python入门
2018/05/08 Python
python 处理string到hex脚本的方法
2018/10/26 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
古驰英国官网:GUCCI英国
2020/03/07 全球购物
彩色的非洲教学反思
2014/02/18 职场文书
小学生期末评语大全
2014/04/21 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
罗马假日观后感
2015/06/08 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript