蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?
标准数独是由一个给与了提示数字的 9*9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个3*3 宫都没有重复的数字出现。
输入格式
一个9×9的数独,数字之间用空格隔开。*表示需要填写的数字。
输出格式
输出一个9×9的数独,把出入中的*替换成需要填写的数字即可。
本题答案不唯一,符合要求的答案均正确
样例输入
* 2 6 * * * * * * * * * 5 * 2 * * 4 * * * 1 * * * * 7 * 3 * * 2 * 1 8 * * * * 3 * 9 * * * * 5 4 * 1 * * 7 * 5 * * * * 1 * * * 6 * * 9 * 7 * * * * * * * * * 7 5 *
样例输出
1 2 6 7 3 4 5 9 8 3 7 8 5 9 2 6 1 4 4 9 5 1 6 8 2 3 7 7 3 9 4 2 5 1 8 6 8 6 1 3 7 9 4 2 5 2 5 4 8 1 6 3 7 9 5 4 7 2 8 1 9 6 3 6 1 3 9 5 7 8 4 2 9 8 2 6 4 3 7 5 1


这道题目类似八皇后问题,只不过八皇后是对每一行进行 1-8 的尝试,而这道题目是对每个空进行 1-9 的尝试。而且这道题目搜索到一种可行解就可以结束了。
标记方法为标记某行某个数字是否出现,标记某列某个数字是否出现,标记某个小方格某个数字是否出现。
1 #include <stdio.h>
2 #include <string.h>
3 #include <iostream>
4 #include <string>
5 #include <math.h>
6 #include <algorithm>
7 #include <vector>
8 #include <stack>
9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const int mod=1e9+7;
16 const double PI = acos(-1);
17 const double eps =1e-8;
18 #define Bug cout<<"---------------------"<<endl
19 const int maxn=1e5+10;
20 using namespace std;
21
22 char G[11][11];
23 int cnt[10]={9,9,9,9,9,9,9,9,9,9};//每个数字剩多少个
24 int flag;//是否找到答案
25
26 void PT()//输出答案
27 {
28 for(int i=0;i<9;i++)
29 {
30 for(int j=0;j<9;j++)
31 {
32 if(j==0) printf("%c",G[i][j]);
33 else printf(" %c",G[i][j]);
34 }
35 printf("\n");
36 }
37 flag=1;
38 }
39
40 int judge(int x,int y,int num)//判断是否可以在G[x][y]处填入num
41 {
42 for(int i=0;i<9;i++)
43 {
44 if(G[x][i]=='0'+num||G[i][y]=='0'+num)
45 return 0;
46 }
47 for(int i=x/3*3;i<x/3*3+3;i++)
48 {
49 for(int j=y/3*3;j<y/3*3+3;j++)
50 {
51 if(G[i][j]=='0'+num)
52 return 0;
53 }
54 }
55 return 1;
56 }
57
58 void DFS(int x,int y) //一层一层搜索
59 {
60 if(x==9&&y==0)
61 {
62 if(flag==0) PT();
63 return;
64 }
65 if(G[x][y]=='*')
66 {
67 for(int i=1;i<=9;i++)
68 {
69 if(judge(x,y,i)&&cnt[i])
70 {
71 G[x][y]='0'+i; cnt[i]--;
72 if(y==8) DFS(x+1,0);
73 else DFS(x,y+1);
74 if(flag) return ;
75 G[x][y]='*'; cnt[i]++;
76 }
77 }
78 }
79 else
80 {
81 if(y==8) DFS(x+1,0);
82 else DFS(x,y+1);
83 }
84 return ;
85 }
86
87
88 int main()
89 {
90 #ifdef DEBUG
91 freopen("sample.txt","r",stdin);
92 #endif
93 ios_base::sync_with_stdio(false);
94 cin.tie(NULL);
95
96 for(int i=0;i<9;i++)
97 {
98 for(int j=0;j<9;j++)
99 {
100 scanf("%c",&G[i][j]);
101 getchar();
102 if(G[i][j]>='1'&&G[i][j]<='9')
103 cnt[G[i][j]-'0']--;
104 }
105 }
106 DFS(0,0);
107
108 return 0;
109 }
-
来源:https://www.cnblogs.com/jiamian/p/12174269.html