本文由我司收集整编,推荐下载,如有疑问,请与我司联系
八皇后问题(
python
版理解)
2016/03/24 1234
八皇后问题是一个经典的数学问题,同时也是一个典型的回溯问题,
《
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
三、基本情形