八皇后问题是计算机中极为经典的一个递归问题。在python中用生成器可以很方便地解决它。
先明确一些细节,产生的解可以用列表或元组保存,这里选择用元祖。元祖的索引充当行数,数值充当列数。
先定义一个验证冲突函数conflict:
>>> def conflict(state,x):
l=len(state)
flag=0
if x in state:
flag=1
else:
for i in range(l):
if abs(x-state[i])==abs(i-l):
flag=1
if flag:
return True
else:
return False
这里输入当前状态元组state,再输入下一行位置x,判断下一个放置棋子的位置是否与之前的皇后冲突。
有了这个函数我们就可以用python的生成器做递归:
def queen(num=8,state=()):
l=len(state)
for i in range(num):
if not conflict(state,i):
if l==num-1:
yield (i,)
else:
for r in queen(num,state+(i,)):
yield r+(i,)
我们先要明确queen函数到底是要做什么,输入棋盘大小num,再输入棋盘当前状态(默认为空),返回当前状态下剩余棋子排放位置。函数运行后r返回所有缺少i的可行棋盘状态,所以最后返回r+(i,),即最后结果。至于如何返回,靠的是递推一层层遍历。这一点有点烧脑,需要好好想。
结果:
>>> len(list(queen(8)))
92