以下是8-queen问题的解决方案。我添加了一行来进行调试,但它改变了输出。有人能告诉我这是什么原因吗? 请尝试评论并取消注释“#print(list(solutions))”,你就会明白我的意思。谢谢,
BOARD_SIZE = 8
def under_attack(col, queens):
return col in queens or \
any(abs(col - x) == len(queens)-i for i,x in enumerate(queens))
def solve(n):
solutions = [[]]
for row in range(n):
solutions = (solution+[i+1]
for solution in solutions # first for clause is evaluated immediately,
# so "solutions" is correctly captured
for i in range(BOARD_SIZE)
if not under_attack(i+1, solution))
#print(list(solutions))
return list(solutions)
answers = solve(BOARD_SIZE)
print(answers)
答案 0 :(得分:2)
因为solutions
是一个生成器,所以当你致电print(list(solutions))
时,你会耗尽发电机。您必须将list(solutions)
分配给变量,然后打印/返回该变量。或者将生成器更改为列表理解。所以,例如。
def solve(n):
solutions = [[]]
for row in range(n):
solutions = [solution+[i+1] for solution in solutions for i in range(BOARD_SIZE) if not under_attack(i+1, solution)]
print(solutions)
return solutions
我也不理解solutions = [[]]
,因为你会立即覆盖它。