Учитывая, что в каждом ряду шахматной доски должна быть ровно одна королева, решение представляется в виде списка горизонтальных положений ферзей в каждом ряду. Кроме того, этот список строится сверху вниз, поэтому, когда вставляется ферзь, она является самой младшей, и все остальные королевы на доске должны находиться в строках над ней.
Поэтому длядля проверки конфликтов есть только три направления: вверх в том же столбце, по диагонали вверх и влево и по диагонали вверх и вправо.
Условие 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)
.