数独,O(∩_∩)O哈哈~做了这道,以后什么数独就可以直接得出答案了……
View Code
1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4
5 int sudo[9][9];
6 int flag;
7
8 void dfs(int a,int b);
9 int is_repeat(int i,int j,int k);
10
11 int main()
12 {
13 char a;
14 int cas=0;
15 while(cin>>a)
16 {
17 memset(sudo,0,sizeof(sudo));
18 int i,j;
19 flag=0;
20
21 for(i=0;i<9;i++)
22 {
23 for(j=0;j<=8;j++)
24 {
25 if(i!=0||j!=0)
26 cin>>a;
27
28 if(a>'0'&&a<='9')
29 sudo[i][j]=a-'0';
30 else
31 sudo[i][j]=0;
32
33 }
34 }
35
36 dfs(0,0);
37 if(cas)
38 cout<<endl;
39 cas++;
40
41 for(i=0;i<9;i++)
42 {
43 for(j=0;j<9;j++)
44 {
45 cout<<sudo[i][j];
46 if(j!=8)
47 cout<<" ";
48 else
49 cout<<endl;
50 }
51 }
52 }
53
54 return 0;
55 }
56 int is_repeat(int i,int j,int k)
57 {
58 int t,p;
59 for(t=0;t<9;t++)
60 {
61 if(sudo[i][t]==k)
62 return 1;
63 }
64
65 for(t=0;t<9;t++)
66 {
67 if(sudo[t][j]==k)
68 return 1;
69 }
70 for(t=i/3*3;t<i/3*3+3;t++)
71 {
72 for(p=j/3*3;p<j/3*3+3;p++)
73 {
74 if(sudo[t][p]==k)
75 return 1;
76 }
77 }
78
79 return 0;
80 }
81
82 void dfs(int a,int b)
83 {
84 if(a==9)
85 {
86 flag=1;
87 return ;
88 }
89
90 if(!sudo[a][b])
91 {
92 //cout<<"*"<<a<<b<<endl;
93 for(int k=1;k<=9;k++)
94 {
95 if(!is_repeat(a,b,k))
96 {
97 sudo[a][b]=k;
98 if(b==8)
99 dfs(a+1,0);
100 else
101 dfs(a,b+1);
102 if(flag)//起初用的是a==9,悲剧的错误,还是问了别人之后才知道的,当回溯后a值不会是9了
103 return;
104 sudo[a][b]=0;//刚开始没有添加这段,悲剧的WA
105 }
106 }
107 }
108 else
109 {
110 if(b==8)
111 dfs(a+1,0);
112 else
113 dfs(a,b+1);
114 }
115 }