http://acm.zjut.edu.cn:8181/web/problem.php?id=1151
1151: 谜之数独
Description
数独是一个有着悠久历史的游戏。据称最早源于瑞士,其后流传至美国,并在日本风行,其名称“
数独”
亦是来源于日语。数独游戏的玩法如下:在 9×9
的大九宫中有 9
个 3×3
的小九宫,并提供一定数量的数字。请在其他空格上填入 1
到 9
的数字,使得:每一行、每一列以及每一个小九宫中均不出现一样的数字。如下图所示(左边为题目,右边为答案)。
MatRush
一不小心创造了一种谜之数独,对于每个谜之数独,他都有一个格子不小心填错了。现在 MatRush
想找出每个谜之数独的填错的格子,就请你写一个程序来找出这个错误格子的位置和它应该填的对应数值吧~
Input
本题有多组数据,第一行是数据组数,接下来每组数据包含一个数独,数据格式请参见样例,保证两个数独之间由一个空行分隔开来,并且数据中没有多余的空格。
Output
对于每组数据,输出一行,格式为 Case #id: (x,y,z)
,其中 id
表示第几组数据,(x,y,z)
表示第 x
行 y
列上应该填数字 z
才能形成正确的数独。行列范围均从 1
开始计算。
Sample Input
2
4 9 6 | 2 8 5 | 3 1 7
3 7 8 | 6 1 4 | 9 2 5
1 5 2 | 9 7 3 | 6 8 4
-------|-------|-------
9 8 1 | 4 6 2 | 7 5 3
5 3 4 | 4 9 8 | 1 6 2
2 6 7 | 5 3 1 | 4 9 8
-------|-------|-------
7 2 9 | 8 4 6 | 5 3 1
8 4 3 | 1 5 9 | 2 7 6
6 1 5 | 3 2 7 | 8 4 9
7 6 5 | 4 3 1 | 2 8 9
2 8 9 | 5 7 6 | 1 3 4
3 4 1 | 9 2 8 | 6 5 7
-------|-------|-------
6 3 8 | 1 3 4 | 5 7 2
1 9 7 | 2 6 5 | 8 4 3
4 5 2 | 3 8 7 | 9 1 6
-------|-------|-------
9 2 4 | 8 5 3 | 7 6 1
5 1 6 | 7 4 9 | 3 2 8
8 7 3 | 6 1 2 | 4 9 5
Sample Output
Case #1: (5,4,7)
Case #2: (4,5,9)
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
{
int sd[9][9];
int x=0,y=0;
string s;
getline(cin,s);
for(int a=0;a<11;a++)
{
getline(cin,s);
for(int aa=0;aa<s.size();aa++)
{
if(s[aa]>='1'&&s[aa]<='9')
{
sd[x][y]=(int)(s[aa]-'1'+1);
y++;
}
}
if(s[0]!='-') {y=0;x++;}
else y=0;
}
for(int b1=0;b1<9;b1++)
{
int c[9]={0};
int b2;
for(b2=0;b2<9;b2++)
{
c[sd[b1][b2]-1]++;
}
int z;
for(z=0;z<9;z++)
if(c[z]==2)
{
for(int d=0;d<9;d++)
{
if(sd[b1][d]==z+1)
{
int c2[9]={0};
for(int f=0;f<9;f++)
{
c2[sd[f][d]-1]++;
}
int g;
for(g=0;g<9;g++)
if(c2[g]==0)
{
cout<<"Case #"<<i+1<<": ("<<b1+1<<","<<d+1<<","<<g+1<<")\n";
goto se;
}
}
}
}
}
se:
;
}
return 0;
}