八皇后问题(python版理解)
来源:互联网 发布:网络编程 什么语言 编辑:程序博客网 时间:2024/05/22 03:53
一、 前言
八皇后问题是一个经典的数学问题,同时也是一个典型的回溯问题,《Python基础教程》简单的思路是:首先尝试在第1行放置第1个皇后,然后在第2行某个位置放置皇后,依次进行,当发现某行的所有位置都不能防止皇后时,回溯至上一行,试着将上一行皇后放置在其他位置,再考虑下一行皇后的位置。
二、规则描述
首先由元组表示皇后的位置,如state[0] = 2,则表示第1行的皇后位于第3列,对于8皇后问题,需要取长度为8的元组表示8皇后的位置。同时该问题可扩展至n皇后。
定义一个冲突函数描述已知皇后和下一个皇后的位置是否有冲突,该函数定义如下:
def conflict(state , nextX): nextY = len(state) for i in range(nextY): #检查已知皇后在各行的位置是否与下一行成对角或同列关系 if abs(state[i] - nextX) in (0 , nextY - i ): return True return False
其中的表达式abs(state[i] - nextX) in (0 , nextY - i )理解为:对于第i行皇后的位置state[i],检查其与第nextY行皇后位置nextX是否是位于同列或对角。同列时满足:state[i] = nextX,也即state[i]– nextX = 0;
对角时,有2种情形需要考虑,其一为第nextY行皇后位置出现于state[i]的右对角线,从水平方向上nextX - state[i]与 垂直方向nextY – i 相等,即:nextX - state[i]= nextY – i
对于另一种情形,则第nextY行皇后位置出现于state[i]的左边对角线,从水平方向上state[i]- nextX 与 垂直方向nextY – i 相等,即:state[i]- nextX= nextY – i
综上,对角线时满足,abs(state[i] - nextX) = nextY – i
三、基本情形
从基本情形开始考虑:当剩余最后一个皇后时,遍历它所有可能的位置,并返回没有冲突发生的位置。函数如下。
def queens(num,state): if len(state) == num -1: #num此处表示皇后总数 for pos in range(num): #num此处表示遍历所有可能的位置 if not conflict(state , pos): yield pos
四、递归
基本情形完成之后,需要考虑此时所剩余的皇后不是最后一个的情形,此时由于需要递归调用queens函数,则可为前面queens函数添加else部分,遍历所有可能位置的可能情形,也即将 num中的所有可能位置加到当前元组中,直至遇到基本情形。代码如下:
else: for pos in range(num): if not conflict(state ,pos): for result in queens( num , state+ (pos ,)): #此处将所有可能进行递归 yield (pos,) + result
通过观察基本情形和递归调用的代码,发现可进一步简化代码,最终代码如下:
def conflict(state , nextX): nextY = len(state) for i in range(nextY): if abs(state[i] - nextX) in (0 , nextY - i ): return True return Falsedef queens(num = 8 , state = ()): for pos in range(num): if not conflict(state , pos): if len(state) == num -1: yield (pos,) else: for result in queens(num , state + (pos,)): yield (pos, ) + result
五、结果
最终8皇后共有92种解法,本文中代码出自《Python基础教程》
- 八皇后问题(python版理解)
- Python版八皇后问题
- 八皇后问题 Python 版
- python-八皇后问题
- Python八皇后问题
- python 八皇后问题
- python-八皇后问题
- Python版的八皇后问题
- 八皇后问题(Python实现)
- python中八皇后问题的个人理解
- 个人理解八皇后问题
- 八皇后问题Python解法
- Python之八皇后问题
- 八皇后问题python实现
- Python实现八皇后问题
- python实现八皇后问题(百练OJ:2754:八皇后)
- 八皇后问题(N皇后问题)
- 八皇后问题(牛人非递归版)
- position定位
- 数据结构课设 银行排队问题之单队列多窗口服务
- Boost编译和配置教程(Win10+VS2013+Boost1.60.0)
- 练习一1016
- C#——判断一个数是奇偶性
- 八皇后问题(python版理解)
- 原生代码加载网络图片和Volley和Picasso的简单介绍和优缺点对比
- mybatis开始第1天
- PHP之PDO
- Ajax基础
- 关于stm32 RTC配置相关说明
- TCP之RST发送场景
- Git与GitFlow工具介绍
- 面试题汇总