Проверка диагонали / конфликт столбцов в задаче n-ферзей - PullRequest
0 голосов
/ 11 февраля 2019

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

Может кто-нибудь объяснить это?

...