数独逻辑求解算法(Java)

数独逻辑求解算法(Java),java,algorithm,recursion,Java,Algorithm,Recursion,我决定为我的数独应用程序编写一个逻辑求解算法。我写的东西只适用于有限数量的网格值,但是递归停止得太快了 我的方法是: addToThirdDimension():三维数组存储可放入logicGrid[x][y]处网格值的任何可能值。此方法刷新三维数组。它通过测试每个网格索引中的值1-9来实现这一点,如果该值有效,则将该值添加到数组中。如果不是,则将该值设置为零 checkValues():检查三维网格中剩余的可能性。它通过logicGrid并返回网格中非零值的数量 checkSingleValu

我决定为我的数独应用程序编写一个逻辑求解算法。我写的东西只适用于有限数量的网格值,但是递归停止得太快了

我的方法是: addToThirdDimension():三维数组存储可放入logicGrid[x][y]处网格值的任何可能值。此方法刷新三维数组。它通过测试每个网格索引中的值1-9来实现这一点,如果该值有效,则将该值添加到数组中。如果不是,则将该值设置为零

checkValues():检查三维网格中剩余的可能性。它通过logicGrid并返回网格中非零值的数量

checkSingleValue(int row,int col):检查logicGrid[row][col]以查看其中是否还有一个且只有一个值(如果还有一个值,这是[row,col]处网格元素的唯一可能性)。它返回该网格位置中的非零值量

getSingleValue(int行,int列):返回logicGrid[row][col]中剩余的单个数字

immutableValues:存储特定网格元素是否不可变的二维布尔数组。如果它是不可变的,则solve方法不应触及它

public boolean solveWithLogic(){

    addToThirdDimension();
    if(checkValues() == 0){
        return true;
    }

    for(int row = 0; row < 9; row++){
        for(int col = 0; col < 9; col++){
            if(!immutableValues[row][col]){
                if(checkSingleValue(row, col) == 1){
                    sGrid[row][col] = getSingleValue(row, col);
                    setValues[row][col] = true;
                    addToThirdDimension();
                }
            }
        }
    }

    if(checkValues() != 0){
        solveWithLogic();
    } else{
        return true;
    }

    return false;
}
public boolean solveWithLogic(){
添加到第三个维度();
如果(checkValues()==0){
返回true;
}
对于(int行=0;行<9;行++){
for(int col=0;col<9;col++){
如果(!immutableValues[row][col]){
if(checkSingleValue(行、列)==1){
sGrid[row][col]=getSingleValue(row,col);
setValues[row][col]=true;
添加到第三个维度();
}
}
}
}
如果(checkValues()!=0){
用逻辑()求解;
}否则{
返回true;
}
返回false;
}
我看不出我错在哪里。经过一定次数的尝试后,checkValues返回0,即使可能还有更多。下面是addToThirdDimension()的代码,因为我确信如果出现问题,它就在这里

sGrid是存储拼图值的主要二维整数数组

public void addToThirdDimension(){

    logicGrid = new int[9][9][9];

    for(int x = 0; x < 9; x++){
        for(int y = 0; y < 9; y++){
            for(int z = 0; z < 9; z++){
                logicGrid[x][y][z] = z + 1;
            }
        }
    }

    int[][] temp1 = sGrid;

    for(int row = 0; row < 9; row++){
        for(int col = 0; col < 9; col++){
            if(setValues[row][col]){
                for(int i = 0; i < 9; i++){
                    logicGrid[row][col][i] = 0;
                }
            } else{
                for(int i = 1; i <= 9; i++){
                    temp1[row][col] = i;
                    if(!isColumnValid(col, temp1) && !isRowValid(row, temp1) &&
                            !isQuadrantValid(row, col, temp1){
                        logicGrid[row][col][i-1] = 0;
                    }
                }
            }
            temp1[row][col] = sGrid[row][col];
        }
    }
}
public void addToThirdDimension(){
logicGrid=新整数[9][9][9];
对于(int x=0;x<9;x++){
对于(int y=0;y<9;y++){
对于(intz=0;z<9;z++){
逻辑网格[x][y][z]=z+1;
}
}
}
int[]temp1=sGrid;
对于(int行=0;行<9;行++){
for(int col=0;col<9;col++){
if(设置值[行][列]){
对于(int i=0;i<9;i++){
logicGrid[row][col][i]=0;
}
}否则{

对于(int i=1;i我要做的第一件事是创建一个存储可能值的SudukoCell对象。然后创建一个包含二维SudukoCells数组的SudukoBoard。也给它一个SudukoAreas数组。一个区域用于行,一个区域用于列,一个区域用于块

适当地添加suduko单元格

这将帮助你巩固你的腿部工作,防止愚蠢的错误


然后每次你解一个数时,你可以去它的每个区域的单元格,并从中删除你解出的数。

你可能想在CodeReview上发表这篇文章:我不太懂java,所以我有一个问题temp1=sGrid;
temp1
的克隆还是仅仅是对它的引用?我将尝试重写我的代码以适应您的模型。与此同时,您看到我哪里出错了吗?或者我的代码整体实现完全错了吗?