【问题标题】:Queens Puzzle Breadth first皇后区拼图广度优先
【发布时间】: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


【解决方案1】:

我不认为 BFS 完全符合我对这个问题的推理方式。相反,专注于递归生成可能的展示位置。对于每个放置的皇后,在下一行中只有一定数量的可能放置不能被攻击。 “放置”一个皇后并在每个位置上递归,并在您放置皇后总数时终止。希望您会认识到混入一些递归调用的 for 循环似乎是一个不错的主意。还记得在递归返回时“拾取”您放置的皇后。

【讨论】:

    【解决方案2】:

    同意之前的条目。上面描述的算法是“深度优先”搜索而不是“广度优先”搜索,并且对于这类问题更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多