Проверка на наличие диагональных / столбцовых конфликтов в задаче 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]))

Может ли кто-нибудь уточнить это?

0 ответов

Другие вопросы по тегам