Итак, я пытаюсь понять это решение проблемы 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]))
Может кто-нибудь объяснить это?