7.12dfs例题:数独游戏

Posted z1110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.12dfs例题:数独游戏相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于7.12dfs例题:数独游戏的主要内容,如果未能解决你的问题,请参考以下文章

数独 (dfs)

数独(dfs解)

NYOJ 722 数独(DFS)

dfs(0634-数独)

c++验证数独问题,求代码

LeetCode37. Sudoku Solver