python关于八皇后问题,有点疑问
这是《Python基础教程》上的八皇后代码:
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 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
for line in list(queens(4)): print line(0, 2, 1, 1)(0, 2, 1, 2)(0, 2, 3, 1)(0, 2, 3, 2)(0, 3, 1, 1)(0, 3, 1, 2)(0, 3, 3, 1)(0, 3, 3, 2)(1, 3, 0, 0)(1, 3, 0, 2)(1, 3, 0, 3)(1, 3, 2, 0)(1, 3, 2, 2)(1, 3, 2, 3)(2, 0, 1, 0)(2, 0, 1, 1)(2, 0, 1, 3)(2, 0, 3, 0)(2, 0, 3, 1)(2, 0, 3, 3)(3, 0, 0, 1)(3, 0, 0, 2)(3, 0, 2, 1)(3, 0, 2, 2)(3, 1, 0, 1)(3, 1, 0, 2)(3, 1, 2, 1)(3, 1, 2, 2)
import randomprettyprint(random.choice(list(queens(8))))
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 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
[解决办法]
如果你对代码不解,把代码改成你认为可以的方式运行跟踪遍看看。这是解惑的正确方式,也是唯一你让你真正否定自己看法的方式。
[解决办法]
建议:先用4皇后推演一遍,我觉得书上已经讲的够清楚了。
代码不应该是有问题的,如楼上所说,conflict的缩进有问题。