Javascript递归数独求解器

问题描述

const puzzle1 = [[0,2,6,7,1],[ 6,8,9,0],[ 1,4,5,[ 8,1,[ 0,3,8],4],6],[ 7,0]];

const puzzle2 = [[5,9],[ 3,2],[ 4,[ 2,3],5],7],[ 9,0]]; // 6,8

var dummy;
dummy = puzzle2;

function poss(x,y,n) {
    for(let i=0;i<dummy.length;i++) {
        if (dummy[x][i] === n) { return false}
        if (dummy[i][y] === n) { return false}
    }

    // find the group start for x and y
    groupSize = Math.sqrt(dummy.length);
    yStart = Math.floor(y/groupSize);
    xStart = Math.floor(x/groupSize);

    // check numbers in the gridgroup
    for (let i=0;i<groupSize;i++) {
        for (let j=0;j<groupSize;j++) {
            if (dummy[i + yStart*groupSize][j + xStart*groupSize] === n) { return false}
        }
    }
    return true;
}

function Solve() {
    for(let y=0;y<dummy.length;y++) {
        for(let x=0;x<dummy.length;x++) {
            if (dummy[y][x] === 0) {
                for (let n=1;n<10;n++) {
                    if (poss(y,x,n)) {
                        dummy[y][x] = n;
                        Solve();
                        dummy[y][x] = 0;
                    }
                }
                return;
            }
        }
    }
    console.log(dummy);
}

我很确定这种逻辑可以解决问题,但是我似乎无法用代码表达它。到目前为止,我遇到了两个问题,

  1. 运行拼图1时,它会将第一个0(左上角)更改为3,并返回“ undefined”。
  2. 它可以正确解决难题2,但会引发此错误
Uncaught TypeError: Cannot set property '9' of undefined
    at Solve (script.js:57)
    at Solve (script.js:56)
    at <anonymous>:1:1

之所以发生这种情况,是因为x和y都等于9,它们不应该作为for循环都只能在x(或y)

逻辑来自一个基于python的视频:https://www.youtube.com/watch?v=G_UYXzGuqvM&t=394s

编辑

第二个问题现在已解决,但现在返回未解决的难题。因为它和基本拼图完全一样。在chrome上使用调试器时,我一直在浏览整个过程,它实际上完全解决了难题,但是即使它是正确的,它也会将所有内容重置为0。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)