Проверка на наличие диагональных / столбцовых конфликтов в задаче n-queens
Итак, я пытаюсь понять это решение проблемы N-Queens, проблемы размещения n ферзей на n×n шахматной доске таким образом, чтобы две королевы не атаковали друг друга. Цель - это рекурсивный подход к возвращению всех различных решений, учитывая размер доски n.
def n_queens(n):
def solve_n_queens(row):
if row == n:
result.append(list(col_placement))
return
for col in range(n):
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, col_placement = [], [0] * n
solve_n_queens(0)
return result
Таким образом, способ, которым работает это решение, является типичным рекурсивным подходом, с массивом размещений столбцов и прохождением каждой строки.
Но я запутался при проверке диагонали и конфликтов столбцов. В частности, я не понимаю логику здесь. Или логика между тем, как это проверяет от конфликтов.
if all(abs(c - col) not in (0, row - i) for i, c in enumerate(col_placement[:row]))
Может ли кто-нибудь уточнить это?