今天刚刚敲得代码,刚刚学会的
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(); } } }
个人觉得有两个非常重要的地方,用红色字体标注。我觉得这两个地方不是很好想到说实话,这两个地方需要自己仔细的琢磨,不是特别好理解。但是自己画画图也是不难的