Python N-Queen解决方案说明

时间:2019-11-06 04:23:37

标签: python-3.x recursion backtracking n-queens

我正在从递归编程一章的递归一章中研究n皇后问题的这个非常好的解决方案,但是似乎无法理解特定的代码。如果有人可以在这里解释逻辑,那将非常有帮助。如果要检查冲突的条件是什么,我想在这里缠住头,但没有成功。

def n_queens(n: int) -> List[List[int]]:
    def solve_n_queens(row):
        if row == n:
            # All queens are legally placed.
            result.append(col_placement.copy())
            return
        for col in range(n):
            # Test if a newly place queen will conflict any earlier queens place before
            # I am struggling to make sense of this if condition
            if all(abs(c - col) not in (0, row - i)
                   for i, c in enumerate(col_placement[:row])):
                   col_placement[row] = col
                   solve_n_queens(row + 1)

    result: List[List[int]] = []
    col_placement = [0] * n
    solve_n_queens(0)
    return result

1 个答案:

答案 0 :(得分:3)

鉴于棋盘的每一行必须正好有一个皇后,解决方案表示为每一行中皇后的水平位置列表。此外,此列表是从上到下构建的,因此,插入女王/王后时,它是目前为止最低的女王,并且板上的所有其他王后必须在其上方的行中。

因此,要检查是否存在冲突,只需要查看三个方向:同一列中的向上方向,左上方的对角线和右上方的对角线。

条件all(abs(c - col) not in (0, row - i))对此进行了检查,到目前为止,棋盘上的每个其他皇后都如此。数字i, c分别代表每个皇后的垂直和水平位置; row, col代表当前正在检查女王/王后是否有冲突。

  • 同一列中的冲突表示c - col == 0
  • 对角线向上和向左的冲突表示c - col == i - row
  • 对角线向右上方的冲突表示c - col == row - i

可以通过取c - col并检查它是否为三个数字(0, i - row, row - i)之一来一次检查所有三个。使用绝对值函数,这等效于测试abs(c - col)是否为两个非负数(0, row - i)之一。

相关问题