python 八皇后问题:
from random import choice
def queen(num=8,state=()):
for pos in range(num):###遍历一行中的每个位置(即x)
if not conflict(state,pos):
if len(state)==num-1:###最后一行
yield (pos,)
else:###否则进行迭代
for result in queen(num,state+(pos,)):
yield (pos,)+result
def conflict(state,nextX):###判断是否与之前的位置处于对角线或者同一列
length = len(state)###state的长度也等于下一个的y坐标
for i in range(length):
###同一列两个的x相同,相减为0;同一对角线斜率的绝对值为1,所以x相减=y相减
if abs(state[i]-nextX) in (0,length-i):
return True
return False
def output(queen_list):###打包格式化输出
for state in queen_list:
print '* '*state+str(state)+' '+'* '*(len(queen_list)-state-1)
if __name__=='__main__':
listone=choice(list(queen()))###随机取出一个列表
output(listone)
输出结果:
>>>
* 1 * * * * * *
* * * * * * 6 *
* * 2 * * * * *
* * * * * 5 * *
* * * * * * * 7
* * * * 4 * * *
0 * * * * * * *
* * * 3 * * * *