您的位置:首页 > 其它

Poj 2676 Sudoku[dfs]

2017-03-23 21:39 281 查看
题目大意:
九宫格问题,也有人叫数独问题

把一个9行9列的网格,再细分为9个3*3的子网格,要求每行、每列、每个子网格内都只能使用一次1~9中的一个数字,即每行、每列、每个子网格内都不允许出现相同的数字。

0是待填位置,其他均为已填入的数字。

要求填完九宫格并输出(如果有多种结果,则只需输出其中一种)

如果给定的九宫格无法按要求填出来,则输出原来所输入的未填的九宫格

思路:

DFS 深搜

char map[10][10];/*数据存储*/
bool row[10][10];/*行存在数*/
bool col[10][10];/*列存在数*/
bool grid[10][10];/*格存在数*/

 

1 /*poj2676 Sudoku*/
2 #include <iostream>
3 #include <cstdio>
4 #include <cstring>
5 using namespace std;
6
7 char map[10][10];
8 bool row[10][10];/*行存在数*/
9 bool col[10][10];/*列存在数*/
10 bool grid[10][10];/*格存在数*/
11
12 bool dfs(int x, int y)
13 {
14     if(x == 10)
15         return true;
16     bool flag = false;
17     if(map[x][y] - '0')
18     {
19         if(y == 9)
20             flag = dfs(x+1, 1);
21         else{
22             flag = dfs(x, y+1);
23         }
24         if(flag)
25             return true;
26         else{
27             return false;
28         }
29     }
30     else{
31         for(int i = 1; i<= 9; i++)
32         {
33             if(!row[x][i] && !col[y][i] && !grid[3*((x-1)/3) + (y-1)/3 + 1][i])
34             {
35                 map[x][y] = i+'0';
36                 row[x][i] = true;
37                 col[y][i] = true;
38                 grid[3*((x-1)/3) + (y-1)/3 + 1][i] = true;
39
40                 if(y == 9)
41                     flag = dfs(x+1, 1);
42                 else{
43                     flag = dfs(x, y+1);
44                 }
45                 if(!flag)
46                 {
47                     map[x][y] = '0';
48                     row[x][i] = false;
49                     col[y][i] = false;
50                     grid[3*((x-1)/3) + (y-1)/3 + 1][i] = false;
51
52                 }
53                 else{
54                     return true;
55                 }
56             }
57         }
58     }
59     return false;
60 }
61
62 void judge()
63 {
64     memset(row, 0, sizeof(row));
65     memset(col, 0, sizeof(col));
66     memset(grid, 0, sizeof(grid));
67
68     for(int i = 1; i<= 9; i++)
69     {
70         for(int j = 1; j<= 9; j++)
71         {
72             if(map[i][j] != '0')
73             {
74                 row[i][map[i][j]-'0'] = true;
75                 col[j][map[i][j]-'0'] = true;
76                 grid[3*((i-1)/3) + (j-1)/3 + 1][map[i][j]-'0'] = true;
77             }
78         }
79     }
80 /*    for(int i = 1; i<= 9; i++)
81     {
82         for(int j = 1; j<= 9; j++)
83             cout<<grid[i][j];
84         printf("\n");
85     }
86     printf("\n");
87 */
88 }
89
90 void solve()
91 {
92     memset(map, 0, sizeof(map));
93     for(int i = 1; i<= 9; i++)
94     {
95         gets(map[i] +1);
96     }
97     judge();
98     dfs(1, 1);
99
100     for(int i = 1; i<= 9; i++)
101         puts(map[i] + 1);
102     printf("\n");
103 }
104
105 int main()
106 {
107     int t;
108 //    freopen("test.txt", "r", stdin);
109     scanf("%d", &t);
110     getchar();
111     while(t--)
112     {
113         solve();
114     }
115     return 0;
116 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: