Я пытаюсь создать генератор судоку для веб-сайта. Я подумал, что могу генерировать головоломки путем случайного выбора чисел для заполнения разделов, пока я следую ограничениям Судоку. И чтобы я не выбирал одно и то же число дважды, я делаю уникальный массив из общих значений любой строки, столбца и раздела, в котором я нахожусь.
Моя проблема заключается в том, что я хочу вернуться назад и "пополнять" раздел всякий раз, когда я сталкиваюсь с ситуацией, подобной приведенной ниже.
984 | 165
561 | 982
372 | 4
При попытке вернуться назад я либо сталкиваюсь с бесконечным l oop, либо с ошибкой, когда один из массивов становится неопределенным. И после того, как я застрял на этой неделе, я думаю, что начинаю думать, что может быть гораздо более эффективный способ создания головоломки.
Вот код, который я использую для заполнения ячеек. Я хотел бы получить несколько советов о том, как правильно вернуться назад, не «ломая» мои массивы и не вызывая бесконечное l oop (например, что произойдет, если я запусту код, который я закомментировал)
const tileFiller = function(board) {
let backup = [1,2,3,4,5,6,7,8,9];
for (let r = 0; r < 9; r+=3) {
for (let c = 0; c < 9; c+=3) {
let section = [1,2,3,4,5,6,7,8,9];
for (let r2 = r; r2 < r+3; r2++) {
for (let c2 = c; c2 < c+3; c2++) {
let numbers = uniqueArr(section, rowArr[r2], colArr[c2]);
let num = numbers[Math.floor(Math.random() * numbers.length)];
let currCell = document.querySelectorAll("tr")[r2].querySelectorAll("input")[c2];
console.log(rowArr);
if (num) {
currCell.value = num
section.splice(section.indexOf(num), 1);
rowArr[r2].splice(rowArr[r2].indexOf(num), 1);
colArr[c2].splice(colArr[c2].indexOf(num), 1);
}
else {
// for (let br2 = r2; br2 > r; br2--) {
// rowArr[br2] = [...backup];
// }
// for (let bc2 = c2; bc2 > c; bc2--) {
// colArr[bc2] = [...backup];
// }
// r2 = r;
break;
}
}
}
}
}
}