算法之DFS数独游戏

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int num[9][9];//用于保存9x9盘面
 6 bool flag = false;//flag为true时表示推算完成,结束递归
 7 
 8 bool check(int n){//判断当前位置的值是否满足条件
 9     int h = n / 9;//行号
10     int l = n % 9;//列号
11     for (int i = 0; i < 9; ++i){//同一列中不能有重复
12         if (i != h && num[i][l] == num[h][l]){
13             return false;
14         }
15     }
16     for (int j = 0; j < 9; ++j){//同一行中不能有重复
17         if (j != l && num[h][j] == num[h][l]){
18             return false;
19         }
20     }
21     for (int i = h / 3 * 3; i < h / 3 * 3 + 3; ++i){//九宫格内不重复
22         for (int j = l / 3 * 3; j < l / 3 * 3 + 3; ++j){
23             if ((i != h || j != l) && num[i][j] == num[h][l]){
24                 return false;
25             }
26         }
27     }
28     return true;
29 }
30 
31 void dfs(int n)
32 {
33     if (n == 81){//如果已经递归到右下角,输出整个盘面,并置flag为true,结束递归
34         for (int i = 0; i < 9; ++i){
35             for (int j = 0; j < 8; ++j){
36                 cout << num[i][j] << ' ';
37             }
38             cout << num[i][8] << endl;
39         }
40         flag = true;
41         return;
42     }
43     int h = n / 9;//行号
44     int l = n % 9;//列号
45     if (num[h][l] == 0){//如果当前位置为0,说明需要推算
46         for (int i = 1; i <= 9; ++i){//枚举1-9的数字,判断哪个满足条件
47             num[h][l] = i;
48             if (check(n)){//判断当前数字是否满足条件
49                 dfs(n + 1);//如果满足条件继续往下递归
50                 if (flag){//如果flag为true表示整个盘面的递归结束了
51                     return;
52                 }
53             }
54         }
55         num[h][l] = 0;//需要回溯,恢复num[h][l]的值为0
56     }else{//当前位置不为0,往下一格递归
57         dfs(n + 1);
58     }
59 }
60 
61 int main()
62 {
63     for (int i = 0; i < 9; ++i){
64         for (int j = 0; j < 9; ++j){
65             cin >> num[i][j];//输入9x9盘面
66         }
67     }
68     dfs(0);//从左上角开始递归
69     return 0;
70 }

 

posted @ 2022-03-08 23:10  技术笔记记录  阅读(85)  评论(0)    收藏  举报