POJ2676-Sudoku
不得不说,这道题真的不难........
【题目描述】
数独是一项非常简单的任务。如图所示,具有9行和9列的方形表被分成9个较小的正方形3x3。在一些单元格中写入从1到9的十进制数字。其他单元格为空。目标是用1到9的十进制数字填充空单元格,每个单元格一个数字,这样在每行,每列和每个标记的3x3子方格中,所有数字从1到9出现。编写程序来解决给定的Sudoku任务。
【输入】
输入数据将以测试用例的数量开始。对于每个测试用例,后面跟着9行,对应于表的行。在每一行上给出一串精确的9位十进制数字,对应于该行中的单元格。如果单元格为空,则表示为0。
【输出】
对于每个测试用例,您的程序应以与输入数据相同的格式打印解决方案。必须根据规则填充空单元格。如果解决方案不是唯一的,则程序可以打印其中任何一个。
【输入示例】
1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107
【输出示例】
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
这道题可以说除了判断九宫格没啥难点。((i-1)/3*3+(j-1)/3+1)
对了,那些ans是指数字有没有在此行此列中出现过。
放代码,哈欠~~~~
1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4 int a[1100][1100];
5 int ans1[1100][1100],ans2[1100][1100],ans3[1100][1100];
6 int n;
7 bool k=0;
8 void put(int x,int y)
9 {
10 if(k==1)
11 {
12 return ;
13 }
14 if(a[x][y]!=0)
15 {
16 if(x==9&&y==9)
17 {
18 for(int i=1; i<=9; i++)
19 {
20 for(int j=1; j<=9; j++)
21 {
22 cout<<a[i][j];
23 }
24 cout<<endl;
25 }
26 k=1;
27 cout<<endl;
28 return ;
29 }
30 if(y==9)
31 {
32 put(x+1,1);
33 }
34 else
35 {
36 put(x,y+1);
37 }
38 }
39 if(a[x][y]==0)
40 {
41 for(int i=1; i<=9; i++)
42 {
43 if(ans1[x][i]==0&&ans2[y][i]==0&&ans3[(x-1)/3*3+(y-1)/3+1][i]==0)
44 {
45 a[x][y]=i;
46 ans1[x][i]=1;
47 ans2[y][i]=1;
48 ans3[(x-1)/3*3+(y-1)/3+1][i]=1;
49 if(x==9&&y==9)
50 {
51 for(int i=1; i<=9; i++)
52 {
53 for(int j=1; j<=9; j++)
54 {
55 cout<<a[i][j];
56 }
57 cout<<endl;
58 }
59 k=1;
60 cout<<endl;
61 return ;
62 }
63 if(y==9)
64 {
65 put(x+1,1);
66 }
67 else
68 {
69 put(x,y+1);
70 }
71 a[x][y]=0;
72 ans1[x][i]=0;
73 ans2[y][i]=0;
74 ans3[(x-1)/3*3+(y-1)/3+1][i]=0;
75 }
76 }
77 }
78 }
79 int main() {
80 cin>>n;
81 for(int l=1; l<=n; l++)
82 {
83 memset(ans1,0,sizeof(ans1));
84 memset(ans2,0,sizeof(ans2));
85 memset(ans3,0,sizeof(ans3));
86 for(int i=1; i<=9; i++)
87 {
88 for(int j=1; j<=9; j++)
89 {
90 char ch;
91 cin>>ch;
92 a[i][j]=ch-'0';
93 if(a[i][j]>0)
94 {
95 ans1[i][a[i][j]]=1;
96 ans2[j][a[i][j]]=1;
97 ans3[(i-1)/3*3+(j-1)/3+1][a[i][j]]=1;
98 }
99 }
100 }
101 k=0;
102 put(1,1);
103 }
104 }
好了,还有题等着我,拜~~
在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹。