Возврат — это общий алгоритм поиска всех (или некоторых) решений проблемы путем постепенного построения решения и отмены (возврата) хода, если он признан неверным. Он используется для решения таких задач, как поиск всех возможных комбинаций или перестановок набора элементов или поиск кратчайшего пути через лабиринт. Поиск с возвратом часто реализуется с использованием рекурсии, и его можно рассматривать как поиск в глубину дерева возможных решений.
Пример в JavaScript:
Одним из примеров проблемы, которую можно решить с помощью поиска с возвратом, является «задача N ферзей», которая состоит в том, чтобы разместить N ферзей на шахматной доске размером NxN таким образом, чтобы никакие два ферзя не атаковали друг друга (т. е. никакие два ферзя не находились в одном ряду, столбец или диагональ).
Вот пример функции JavaScript, которая решает проблему N-Queens с помощью поиска с возвратом:
function solveNQueens(n) { let solutions = []; let queens = Array(n).fill(-1); function placeQueens(row) { if (row === n) { solutions.push(queens.slice()); return; } for (let col = 0; col < n; col++) { if (isSafe(row, col)) { queens[row] = col; placeQueens(row + 1); queens[row] = -1; } } } function isSafe(row, col) { for (let i = 0; i < row; i++) { if (queens[i] === col || // same column queens[i] - i === col - row || // same diagonal queens[i] + i === col + row) { // same diagonal return false; } } return true; } placeQueens(0); return solutions; }
В этом примере функция placeQueens
является алгоритмом поиска с возвратом. Он начинается с первой строки и пытается разместить ферзя в каждом столбце. Если он находит безопасную позицию, он ставит ферзя и переходит к следующему ряду. Если он достигает строки, в которой не может найти безопасную позицию, он возвращается к предыдущей строке и пробует следующий столбец. После того, как все ферзи размещены на доске без каких-либо конфликтов, конфигурация доски передается в массив решений.
Эта функция вернет массив всех возможных решений, где каждый элемент массива представляет собой массив, представляющий столбец каждого ферзя в этом решении.
Например:
solveNQueens(4)
вернется
[ [1, 3, 0, 2], [2, 0, 3, 1] ]
Это всего лишь один пример, поиск с возвратом может быть применен ко многим задачам, таким как задача перестановки и комбинации, судоку, решение лабиринта и т. д.