代码均来自《Python基础教程(第二版修订版)》第九章,注释均是自己对八皇后的理解
state表示目前所取到的所有八皇后的位置,数组位置表示y轴(第几行),数组位置对应值对应x轴(表示第几列)。nextX表示下一行第几个位置(nextX跟nextY理解成x轴y轴,方便理解)
defconflict(state, nextX):
/* 获取下一个是第几行 */
nextY = len(state)
for i in range(nextY):
/*state[i]是表示x轴上的点,因为nextX是会由0开始数数,数到符合条件或者到达最大边界,就停止了。
* 符合的条件:不在同一条x轴上,如果state[i]-nextX == 0 则是x轴相同,而 i则是i代表y轴由0开始遍历,nextY - i 则表示不在一条对角线上,至于为什么nextY - 1 == state[i] - nextX就不在一条对角线上,则可以想象成一条与x轴y轴都会相交的直线,简化成x - y = c 与x + y = c,根据位置带入等式就行了(这里你可能会迷糊,其实对角线就是根据当c=0的时候穿过坐标系原点(0,0)且成45度角,我们要确保的是等式的c不相同,故而任意的两个点,或者说任意的两个皇后的xy的位置互相减不能相等(就是|x1 - x2| != |y1 - y2|),相等的话必然c相等),理解了下面的代码就看懂了,还迷糊就自己画图吧,哈哈哈 */
if abs(state[i] - nextX) in (0, nextY - i):
return True
return False
/* pos 可以理解为x轴上的点,但是y轴呢?每找出一个点,点在state的位置就是y轴了 ,比如state[i] = pos*/
def 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
必要的解释都给了,转载请注明
题外话:
用简书写好难写啊。
网友评论