17. Python脚本学习笔记十七Python的八皇后问题
本篇名言:“做官是一张纸,做人是一辈子;金钱是一张纸,健康是一辈子;夫妻是一张纸,感情是一辈子;荣誉是一张纸,朋友是一辈子!”
我们接下去看下如何使用生成器来解决实际问题,这里以八皇后问题为例。八皇后问题在数据结构笔记中有一节描述,采用C语言来解决该会提,我们来Python解决是否会更高效。
八皇后问题在此不再啰嗦了,网络上有一大堆,可以参考
yield关键字用来定义生成器(Generator),可以当return使用,它从函数里返回一个值,不同之处是用yield返回之后,可以让函数从上回yield返回的地点继续执行。直到yield语句再返回一个新的值。
1. 碰撞检测
如下:
defconflict(state,nextX):
nextY=len(state)
for i inrange(nextY):
if abs(state[i]-nextX) in(0,nextY-i):
returnTrue
returnFalse
nextX,nextY表示下一个皇后的横坐标和纵坐标。
State是存放前面皇后的位置信息的元组。
完整代码如下:
defconflict(state, nextX):
nextY = len(state)
for i inrange(nextY):
if abs(state[i]-nextX) in(0, nextY-i):
returnTrue
returnFalse
defqueens(num=8,state=()):
for pos in range(num):
ifnotconflict(state, pos):
if len(state) == num-1:
yield (pos,)
else:
for result in queens(num,state + (pos,)):
yield (pos,)+result
printlist(queens(8,state=()))
printlen(list(queens(8,state=())))
短短十几行代码就实现了
其中包含了回溯和迭代,需要慢慢品味。