【发布时间】:2013-12-06 10:05:14
【问题描述】:
有人告诉我要编写一个程序,使用breadth first search 解决eight queens puzzle。这是我到目前为止所得到的:
def n_queens(n, width):
if n == 0:
return [[]
else:
return add_queen(n-1, width, n_queens(n-1, width))
def add_queen(new_row, width, previous_solutions):
solutions = []
for sol in previous_solutions:
for new_col in range(width):
if safe_queen(new_row, new_col, sol):
solutions.append(sol + [new_col])
return solutions
def safe_queen(new_row, new_col, sol):
for row in range(new_row):
if (sol[row] == new_col or
sol[row] + row == new_col + new_row or
sol[row] - row == new_col - new_row):
return 0
return 1
for sol in n_queens(8, 8):
print sol
有什么办法可以改善吗?
【问题讨论】:
-
一个明显的改进是让它工作。此代码不起作用。第一个明显的错误是
n_queens递归没有基本情况。 -
不过,这似乎是唯一的错误。放入基本案例
if not n: return [[]]后,代码会产生预期的结果。 -
BFS 通常不会以递归方式实现,而是以迭代方式实现。它只需要您使用双端队列(双端队列),将子级添加到队列的末尾并将它们从前面弹出。
-
@Daniel Roseman 我以前从未使用过双端队列。你能给我一个在这个场景中使用它的例子吗?
-
您遍历“相邻”节点/接下来的步骤,如果之前没有看到它们,则将它们添加到队列的末尾。当您检查完当前步骤的所有相邻节点/下一步后,删除当前位于队列头部/开始的当前步骤,然后在队列中的下一步/新头部中进行 BFS。
标签: python artificial-intelligence n-queens