dfs:深度优先搜索(深搜)
思路是把一种可能性走到底,在回头到上一个路口,走另一种可能性。
数独游戏:
有一个9个3*3的小格子,拼成了一个9*9的矩阵,预输入1~9这种数字到某个格子上,其余格子是0。
我们要做的就是把没有数字的格子上添上数字,使得这个9*9的矩阵每一行每一列的数字都是1~9不重复,并且9个3*3的小矩阵中,这9个数字也只能是1~9不允许重复。
思路:
1.定义一个char类型的二维数组用来存储9*9的矩阵,将输入字符串转换为一个字符数组存入。
2.dfs方法:如果当前[x][y]位置的数为0,则从1~9中挨个试填数字,如果填入的数字满足行列1~9不重复,并且当前3*3小矩阵1~9不重复,则可以填入,然后递归,传入下一个x和y位置,x的位置应该是x+(y+1)/9,y的位置应该是(y+1)%9。如果当前[x][y]位置的数不为0,则直接递归,传入下一个x和y位置。递归退出条件为x==9时。打印矩阵,终止程序。
1 public class Seven_12dfs例题数独游戏 { 2 private static void dfs(char[][] table, int x, int y) { 3 if (x == 9) { 4 print(table); 5 System.exit(0); 6 } 7 if (table[x][y] == ‘0‘) { 8 // 选择1~9之间合法的数字填到x,y这个位置 9 for (int k = 1; k < 10; k++) { 10 if (check(table, x, y, k)) { 11 table[x][y] = (char) (‘0‘ + k); 12 dfs(table, x + (y + 1) / 9, (y + 1) % 9); // 处理下一个状态 13 } 14 } 15 table[x][y] = ‘0‘; // 回溯 16 } else { 17 // 如果当前位置有数字了,则继续找下一个需要处理的位置 18 dfs(table, x + (y + 1) / 9, (y + 1) % 9); 19 } 20 } 21 22 public static boolean check(char[][] table, int i, int j, int k) { 23 // 检查同行和同列 24 for (int l = 0; l < 9; l++) { 25 if (table[i][l] == (char) (‘0‘ + k)) 26 return false; 27 if (table[l][j] == (char) (‘0‘ + k)) 28 return false; 29 } 30 for (int l = (i / 3) * 3; l < (i / 3 + 1) * 3; l++) { 31 for (int m = (j / 3) * 3; m < (j / 3 + 1) * 3; m++) { 32 if (table[l][m] == (char) (‘0‘ + k)) 33 return false; 34 } 35 } 36 return true; 37 } 38 39 private static void print(char[][] table) { 40 for (int i = 0; i < 9; i++) { 41 System.out.println(new String(table[i])); 42 } 43 } 44 45 public static void main(String[] args) { 46 Scanner sc = new Scanner(System.in); 47 char[][] table = new char[9][9]; 48 for (int i = 0; i < 9; i++) { 49 table[i] = sc.nextLine().toCharArray(); 50 } 51 dfs(table, 0, 0); 52 } 53 }
原文地址:https://www.cnblogs.com/z1110/p/12604628.html
时间: 2024-10-18 16:16:09