数独

数独

时间限制: 1 Sec  内存限制: 128 MB

题目描述

这个游戏只有一个规则:
将格子填满使得每一行,每一列,和每一个小的九宫格,恰好包含1-9这9个数字

正是由于规则简单而又变化多端,数独一时间风靡全球。
现在,我们希望你能编写一个程序解决数独问题。
 

输入

输入数据一共9行,每行有9个字符。
输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。
我们的输入数据总保证有唯一解。
 

输出

输出一共9行,每行9个数字,表示你的答案。

样例输入

5????7??6
?6????5?4
?834?????
???182?4?
??1???9??
?7?369???
?????543?
1?5????9?
7??2????1

样例输出

514927386
967831524
283456179
659182743
321574968
478369215
892615437
135748692
746293851
 

题解

不喜欢这种麻烦的搜索题。给每个小九宫格编号,记录每行、列、小九宫格中是否出现数字i,用来剪枝,dfs时枚举1到9,判断在(x,y)这个位置能否是i。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<iostream>
 5 using namespace std;
 6 char c[10][10];
 7 int g[10][10];
 8 bool vr[10][10], vc[10][10], p[10][10];
 9 int GetNum(int x, int y)
10 {
11     if(x <= 3) return y / 3 + (y % 3 != 0);
12     if(x <= 6) return 3 + y / 3 + (y % 3 != 0);
13     if(x <= 9) return 6 + y / 3 + (y % 3 != 0);
14 }
15 void print()
16 {
17     for(int i = 1; i <= 9; i++)
18     {
19         for(int j = 1; j <= 9; j++)
20             printf("%d", g[i][j]);
21         printf("\n");
22     }
23     exit(0);
24 }
25 void dfs(int x, int y)
26 {
27     if(x >= 10) print();
28     if(g[x][y])
29     {
30         if(y < 9) dfs(x, y + 1);
31         else dfs(x + 1, 1);
32         return;
33     }
34     int t = GetNum(x, y);
35     for(int i = 1; i <= 9; i++)
36         if(!vr[x][i] && !vc[y][i] && !p[t][i])
37         {
38             vr[x][i] = 1; vc[y][i] = 1; p[t][i] = 1; g[x][y] = i;
39             if(y < 9) dfs(x, y + 1);
40             else dfs(x + 1, 1);
41             vr[x][i] = 0; vc[y][i] = 0; p[t][i] = 0; g[x][y] = 0;
42         }
43 }
44 int main()
45 {
46     for(int i = 1; i <= 9; i++)
47         scanf("%s", c[i] + 1);
48     for(int i = 1; i <= 9; i++)
49         for(int j = 1; j <= 9; j++)
50             if(isdigit(c[i][j]))
51             {
52                 g[i][j] = c[i][j] - '0',
53                 vr[i][g[i][j]] = 1,
54                 vc[j][g[i][j]] = 1;
55                 int t = GetNum(i, j);
56                 p[t][g[i][j]] = 1;
57             }
58     dfs(1,1);
59     return 0;
60 }
View Code

 

 

posted @ 2020-03-14 20:43  Johnny-English  阅读(431)  评论(0编辑  收藏  举报