我决定为我的Sudoku应用程序编写一个逻辑求解算法。我写的内容适用于有限数量的网格值,但递归过早停止。
我的方法是做什么的: addToThirdDimension():三维数组存储可以放入logicGrid [x] [y]的网格值的任何可能值。此方法刷新三维数组。它通过在每个网格索引中测试值1-9来做到这一点,如果它有效,它会将该数字添加到数组中。如果不是,则将该值设置为零。
checkValues():检查三维网格中剩余的可能性。它遍历logicGrid并返回网格中非零值的数量。
checkSingleValue(int row,int col):检查logicGrid [row] [col]以查看其中是否只剩下一个值(如果剩下一个值,则它是grid元素的唯一可能性在[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];
}
}
}
目前代码效率不高。我想在开始最小化解决时间之前让它工作。
答案 0 :(得分:2)
我要做的第一件事就是创建一个SudukoCell对象,在其中存储可能的值。然后使用2d SudukoCells数组创建一个SudukoBoard。还给它一系列SudukoAreas。行的一个区域,cols的一个区域和块的一个区域。
适当添加你的suduko细胞。
这将有助于您巩固您的腿部工作并防止愚蠢的错误。
然后每当你解决一个数字时,你可以转到每个区域的单元格,并删除你从中解决的数字。