Что касается решения JavaScript для проблемы восьми королев, я всегда чувствую, что мне нужно выучить алгоритм. Будет неловко узнать, использую ли я один день.
фон
Восемь вопроса королев - это вопрос, основанный на шахматах: как можно помещать восемь королев на шахматную доску 8 × 8, чтобы ни одна королева не могла съесть других королев напрямую? Чтобы достичь этого, ни одна королева не может быть в одной горизонтальной, вертикальной или диагональной линии
Восемь проблемы королев можно обобщить до более общей проблемы размещения n Queen: в настоящее время размер шахматной доски становится N × N, а количество королев также становится N. Если и только тогда, когда n = 1 или n ≥ 4 есть решение проблемы
Алгоритм слепого перечисления
Благодаря n-разбайным петлям перечисленные решения, которые соответствуют ограничениям (здесь выполняется много восьмикратных циклов, здесь выполняются четырехкратные петли), находят все возможные позиции четырех королев, а затем судите во всей правлении, будут ли эти четыре королевы съесть друг друга напрямую. Идея программы относительно проста.
function check1 (arr, n) {for (var i = 0; i <n; i ++) {for (var j = i+1; j <n; j ++) {if ((arr [i] == arr [j]) || math.abs (arr [i] - arr [j]) == j - i) {return false; }}} return true;} функция Queen1 () {var arr = []; для (arr [0] = 1; arr [0] <= 4; arr [0] ++) {for (arr [1] = 1; arr [1] <= 4; arr [1] ++) {for (arr [2] = 1; arr [2] <= 4; arr [2] ++) {для (arr arr] = 1; arr; [3] <= 4; продолжать; } else {console.log (arr); }}}}}}}}}}}}}}}}}}}}}}}} / }}}}}}}}}}}}}}}}}}}}}}}} / }}}}}}}}}}}}}}}}}}}}}}}} / }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Что касается результата, в 4*4 шахматной доске четыре королевы не могут быть в ряд. ARR [0] для ARR [3] соответствует четырем королевам соответственно. Значение, соответствующее индексу массива, и индекса, является позицией королевы в плате.
Метод отступления
«Если ты не можешь пойти, просто повернись». Определите, соответствует ли он в соответствующем узле. Если это не совпадает, вы больше не будете исследовать эту ветвь.
function check2 (arr, n) {for (var i = 0; i <= n - 1; i ++) {if ((math.abs (arr [i] - arr [n]) == n - i) || (arr [i] == arr [n])) {return false; }} return true;} function Queen2 () {var arr = []; for (arr [0] = 1; arr [0] <= 4; arr [0] ++) {for (arr [1] = 1; arr [1] <= 4; arr [1] ++) {if (! check2 (arr, 1)) продолжить; // Укажите конфликт между двумя королевами для (arr [2] = 1; arr [2] <= 4; arr [2] ++) {if (! Check2 (arr, 2)) продолжить; // Укажите конфликт между тремя королевами для (arr [3] = 1; arr [3] <= 4; arr [3] ++) {if (! Check2 (arr, 3)) {продолжение; } else {console.log (arr); }}}}}}}}}}}}}}}}}}}}}}}} / }}}}}}}}}}}}}}}}}}}}}}}} / }}}}}}}}}}}}}}}}}}}}}}}} / }}}}}}}}}}}}}}Не-рекурсивное возвращение
Алгоритм структура:
В то время как (k> 0 『есть способ пойти』 и 『『 не достиг цели 』) {// k> 0『 Существует способ пойти, если (k> n) {// поиск узлов листьев // Поиск решения, вывод} else {// a [k] Пространство ") {// пометить ресурс занятый // k = k + 1; } else {// Очистить пространство занятого состояния // k = k - 1; }}}Конкретный код выглядит следующим образом. Самый внешний слой, находясь в пределах, содержит две части. Одним из них является обход возможных значений нынешних королев, а другое - это решение, следует ли входить в следующий слой или отступить предыдущий слой.
Функция Backdate (n) {var arr = []; var k = 1; // nth Queen Arr [0] = 1; while (k> 0) {arr [k-1] = arr [k-1] + 1; while ((arr [k-1] <= n) && (! check2 (arr, k-1))) {arr [k-1] = arr [k-1] + 1; } // Эта королева удовлетворяет ограничениям и делает следующее решение, если (arr [k-1] <= n) {if (k == n) {// nth Queen console.log (arr); } else {k = k + 1; // следующая королева Arr [k-1] = 0; }} else {k = k - 1; // Backtrack, последняя королева}}} Backdate (4); // [2, 4, 1, 3] // [3, 1, 4, 2]Рекурсивный метод отступления
Рекурсивные вызовы значительно уменьшают количество кода и увеличивают читаемость программы.
var arr = [], n = 4; function BackTrack (k) {if (k> n) {console.log (arr); } else {for (var i = 1; i <= n; i ++) {arr [k-1] = i; if (check2 (arr, k-1)) {BackTrack (k + 1); }}}}} BackTrack (1); // [2, 4, 1, 3] // [3, 1, 4, 2]Великолепный Амб
Что такое AMB? Дайте ему список данных, который может вернуть способ удовлетворить ситуации успеха ограничений. Без успеха это потерпит неудачу. Конечно, это может вернуть все ситуации успеха. Автор написал так много очков выше, чтобы порекомендовать этот алгоритм AMB здесь. Это подходит для обработки простых сценариев отступления. Это очень интересно. Посмотрим, как это работает.
Во -первых, давайте решим небольшую проблему, найдем соседние строки: получите несколько наборов струнных массивов, и каждый массив вынимает строку. Последний символ предыдущей строки такой же, как и первый символ следующей строки. Если условия будут выполнены, вновь извлеченные строки будут выводиться.
ambRun(function(amb, fail) { // Constraint method function linked(s1, s2) { return s1.slice(-1) == s2.slice(0, 1); } // Inject data list var w1 = amb(["the", "that", "a"]); var w2 = amb(["frog", "elephant", "thing"]); var w3 = amb(["walked", «Переход», «Расширение»]; медленно"});Это выглядит очень просто или нет! Тем не менее, предпосылка использования заключается в том, что вы не заботитесь о производительности, это действительно пустая трата времени!
Ниже приведена реализация JavaScript. Если вы заинтересованы, вы можете изучить, как он извлекает обратную переход.
Функция ambrun (func) {var shocts = []; var index; function amb (values) {if (values.length == 0) {fail (); } if (index == shoce.length) {choices.push ({i: 0, count: values.length}); } var Choice = выбор [index ++]; возвращаемые значения [Choice.i]; } function fail () {throw Fail; } while (true) {try {index = 0; вернуть фанк (AMB, FAIL); } catch (e) {if (e! = Fail) {throw e; } var Choice; while (((выбор = выбор. } shoce.push (выбор); }}}И конкретный код проблемы восьми королев, реализованный с использованием AMB
ambrun (function (amb, fail) {var n = 4; var arr = []; var turn = []; for (var n = 0; n <n <n; n ++) {turn [turn.length] = n +1;} while (n--) {arr.length] = amb (turn);} для (var i = 0; i <n; +j); var a = arr [i], b = arr [j];Решение JavaScript для проблемы восьми королев
Это решение Javascript для проблемы восьми королев. Вся программа не используется для петли и реализуется посредством рекурсии. Он полностью использует карту, уменьшает, фильтрует, CONCAT, методы срезов объекта массива.
'Использовать строгое'; var queens = function (boardersize) {// Использовать рекурсию для генерации интервала варрета от начала к END = function (start, end) {if (start> end) {return []; } интервал возврата (старт, конец - 1) .concat (end); }; // Проверьте, является ли комбинация допустимой var isValid = function (queencol) {// Проверьте, существует ли конфликт между двумя позициями var issafe = function (pointa, pointb) {var slope = (pointa.row - pointb.row) / (pointa.col - pointb.col); if ((0 === Slope) || (1 === Slope) || (-1 === Slope)) {return false; } вернуть true; }; var len = queencol.length; var pointtocompare = {row: queencol [len - 1], col: len}; // Сначала вырезать массив, кроме последнего столбца, затем проверьте, существует ли конфликт между точками в каждом столбце и тестируемыми точками, и, наконец, объедините результаты теста. Return queencol .slice (0, len - 1) .map (function (row, index) {return issafe ({row: row, col: index + 1}, pointtocompare);}) .reduce (a, b) {return a && b;}); }; // рекурсивно генерировать комбинации, которые соответствуют правилам var queencols = function (size) {if (1 === size) {return Quardal (1, boardersize) .map (function (i) {return [i];}); } // Сначала разверните набор всех предыдущих столбцов, которые соответствуют правилам, затем используйте уменьшение размера размерности и, наконец, используйте ISValid для фильтрации комбинаций, которые соответствуют правилам возврата Queencols (размер - 1) .map (function (queencol) {return verval (1, boardersize) .map (function (row) {return Queencol. Concat (rows); (a, b) {return a.concat (b);}) .filter (isvalid); }; // queens function entry return queenCols(boarderSize);};console.log(queens(8));// Output result:// [ [ 1, 5, 8, 6, 3, 7, 2, 4 ],// [ 1, 6, 8, 3, 7, 4, 2, 5 ],// ...// [ 8, 3, 1, 6, 2, 5, 7, 4 ],// [ 8, 4, 1, 3, 6, 2, 7, 5]]]PS: Проблема с расширенной n Queen
Когда шахматный игрок Макс Бецзель спросил восьми головоломков королев в 1848 году, он, вероятно, никогда не думал, что более 100 лет спустя эта проблема стала одним из самых важных обязательных курсов по обучению программированию. Проблема восемь королев звучит очень просто: поместите восемь королев на шахматную доску, чтобы восемь королев не атаковали друг друга (шахматная доска представляет собой массив 8 × 8, и королева могла предпринять несколько шагов в любом из восьми направлений горизонтально и вертикально). Хотя в этой проблеме есть 92 решения, нелегко найти одно решение голыми руками. Следующий рисунок является одним из решений:
Существует много вариантов проблемы восьми королев, но независимо от того, насколько это тяжело, это не будет более красивым, чем следующий вариант: пожалуйста, разработайте план, чтобы разместить королеву в каждом ряду и каждую колонку бесконечной шахматной доски, чтобы все королевы не атаковали друг друга. В частности, предположим, что нижний левый угол этой платы находится на начале, с бесконечными рядами снизу в верхнюю и бесконечную колонны слева направо, вам нужно найти расположение всех положительных целых чисел A1, A2, A3,… так что, когда вы помещаете первую королеву в первом ряду в колонке A1, вторая королева в колонне A2 и т. Д., То, затем не будет атаковать друг друга.
Вот очень простая и умная конструкция. Во -первых, мы даем ответ на проблему из пяти королев. И очень важно, что одна из королев занимает сетку в левом нижнем углу.
Далее мы расширяем решение пяти королев до 25 королев и основываясь на макете самого пяти королев:
В результате пять королев в одной и той же группе, очевидно, не будут атаковать друг друга, а королевы в разных группах, очевидно, не будут атаковать друг друга. Это решение 25 королев, которое отвечает требованиям. Обратите внимание, что после расширения ранее заполненный раздел не изменился.
Что мне делать дальше? Правильно, мы скопировали 25 -й королевской разблокировки на пять кусочков и организовали его снова в соответствии с макетом пяти королев, тем самым расширяясь до 125 королев!
Постоянно расширяясь наружу на основе таких заполненных частей, вы можете генерировать решение проблемы бесконечной королевы.