今天刚刚敲得代码,刚刚学会的
public class test3 {
public static int[][] map;
public static boolean isValid(int[][] map,int row,int col,int num){
for(int i = 0;i < 9;i++){
if(map[i][col] == num){
return false;
}
if(map[row][i] == num){
return false;
}
if(map[3*(row/3)+i/3][3*(col/3)+i%3] == num){
return false;
}
}
return true;
}
public static boolean backtracking(int[][] map,int row,int col){
//以列扫描,当到达最后一列的时候就去下一行
if(col == map[0].length){
return backtracking(map,row+1,0);
}
//当行数超过棋盘行数的时候,直接return
if(row == map.length){
return true;
}
//如果出现了已经填了数字的情况下就直接跳过往下算
if(map[row][col] != 0){
return backtracking(map,row,col+1);
}
//进入回溯法关键部分
for(int i = 1;i <= 9;i++){
//如果这个数字可以填进去,那么我们就填入
if(!isValid(map,row,col,i)){
continue;
}
map[row][col] = i;
//就是如果按照这个数字填了成功的话,那么就返回true,如果没有说明这个数独这个空不是这个数字
if(backtracking(map,row,col)){
return true;
}
//如果不是填回原来的数字0
map[row][col] = 0;
}
return false;
}
public static void main(String[] args){
map = new int[][]{{0,0,5,3,0,0,0,0,0},
{8,0,0,0,0,0,0,2,0},
{0,7,0,0,1,0,5,0,0},
{4,0,0,0,0,5,3,0,0},
{0,1,0,0,7,0,0,0,6},
{0,0,3,2,0,0,0,8,0},
{0,6,0,5,0,0,0,0,9},
{0,0,4,0,0,0,0,3,0},
{0,0,0,0,0,9,7,0,0}};
backtracking(map,0,0);
for(int i = 0;i < 9;i++){
for(int j = 0;j < 9;j++){
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
个人觉得有两个非常重要的地方,用红色字体标注。我觉得这两个地方不是很好想到说实话,这两个地方需要自己仔细的琢磨,不是特别好理解。但是自己画画图也是不难的
这篇博客分享了一个使用Java实现的数独求解器,通过回溯法检查每一格数字是否合法。博客中强调了两个关键点,即判断数字是否在当前行、列和宫格重复的逻辑,以及如何递归填充和回溯。代码详细展示了如何构建和验证数独矩阵,适合初学者理解和学习算法。
1190

被折叠的 条评论
为什么被折叠?



