我正在从递归编程一章的递归一章中研究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
答案 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)
之一。