N ферзей
Расставить ферзей так, чтобы никто никого не бил: перебор с откатами.
1function solveNQueens(n: number): number[][] {2 const solutions: number[][] = []3 const queens: number[] = [] // queens[row] = column4 5 function place(row: number): void {6 if (row === n) {7 solutions.push([...queens])8 return9 }10 for (let col = 0; col < n; col++) {11 if (isSafe(row, col)) {12 queens[row] = col13 place(row + 1)14 queens.pop() // откат15 }16 }17 }18 19 function isSafe(row: number, col: number): boolean {20 for (let r = 0; r < row; r++) {21 if (queens[r] === col) return false // столбец22 if (Math.abs(queens[r]! - col) === row - r) return false // диагональ23 }24 return true25 }26 27 place(0)28 return solutions29}Проблема
Расставить ферзей так, чтобы никто никого не бил: перебор с откатами.
Что вы видите
Доска: строка за строкой; клетка под боем гаснет, тупик откатывает ферзя назад.
Как это работает
Backtracking в чистом виде: выбор → рекурсия → откат. Проверка безопасности только по уже поставленным ферзям отсекает ветви рано. Скелет тот же, что у судоку и SAT-солверов.
Пошаговый разбор
- 01
Строка
Ферзь ставится по строке за раз.
- 02
Проверка
Столбец и диагонали заняты?
- 03
Откат
Тупик ниже — снимаем ферзя.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Судоку
Тот же backtracking на сетке 9×9.
Расписания
Задачи и слоты без конфликтов.
VLSI
Размещение чипов без пересечений.
Связанные алгоритмы
«Тупик — значит откатись: N ферзей»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.