Sudoku的逻辑解算算法(Java)

我决定为我的Sudoku应用程序编写一个逻辑求解算法。 我写的内容适用于有限数量的网格值,但递归过快停止。

我的方法做什么:addToThirdDimension():三维数组存储可以放入逻辑网格值logicGrid [x] [y]的所有可能值。 该方法刷新三维数组。 它通过在每个网格索引中测试值1-9来完成此操作,并且如果它有效,则会将该数字添加到数组中。 如果不是,则将该值设置为零。

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

checkSingleValue(int row,int col):检查logicGrid [row] [col]以查看是否只有一个值留在那里(如果剩下一个值,则它是[row ,col])。 它返回该网格位置中的非零值的数量。

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

immutableValues:一个二维布尔数组,用于存储特定的网格元素是否是不可变的。 如果它是不可变的,解决方法不应该碰它。

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;
}

我看不到我错在哪里。 经过一定次数的尝试后,即使应该有更多的可能性,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];
        }
    }
}

代码目前效率不高。 在开始最小化解决时间之前,我想让它工作。


我要做的第一件事就是创建一个SudukoCell对象,它将可能的值存储在其中。 然后创建一个带有SudukoCells二维阵列的SudukoBoard。 也给它一系列SudukoAreas。 一个区域为行,一个区域为cols,一个区域为块。

适当地添加你的suduko细胞。

这将帮助你巩固你的拼搏并防止愚蠢的错误。

那么每当你解决一个号码时,你可以去每个区域的单元格,并删除你解决的号码。

链接地址: http://www.djcxy.com/p/96155.html

上一篇: Logic Solving Algorithm for Sudoku (Java)

下一篇: Optimizing the backtracking algorithm solving Sudoku