ZJUT 1151 谜之数独

http://acm.zjut.edu.cn:8181/web/problem.php?id=1151


1151: 谜之数独

Description

数独是一个有着悠久历史的游戏。据称最早源于瑞士,其后流传至美国,并在日本风行,其名称数独亦是来源于日语。数独游戏的玩法如下:在 9×9  的大九宫中有 个 3×3  的小九宫,并提供一定数量的数字。请在其他空格上填入 到 的数字,使得:每一行、每一列以及每一个小九宫中均不出现一样的数字。如下图所示(左边为题目,右边为答案)。
MatRush  一不小心创造了一种谜之数独,对于每个谜之数独,他都有一个格子不小心填错了。现在 MatRush  想找出每个谜之数独的填错的格子,就请你写一个程序来找出这个错误格子的位置和它应该填的对应数值吧~

Input

本题有多组数据,第一行是数据组数,接下来每组数据包含一个数独,数据格式请参见样例,保证两个数独之间由一个空行分隔开来,并且数据中没有多余的空格。

Output

对于每组数据,输出一行,格式为 Case #id: (x,y,z) ,其中 id  表示第几组数据,(x,y,z)  表示第 行 列上应该填数字 才能形成正确的数独。行列范围均从 开始计算。

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值