斯卡布罗集市里最近流行一款数学游戏——数独。
珂朵莉陪着威廉,来到了斯卡布罗集市。
有一个商铺的店主说,如果珂朵莉能说出他给出的一个可能未完成的数独目前是否存在错误,那么他就会送珂朵莉一份小礼物。
珂朵莉很喜欢那个小东西,她很想要它,所以请你来帮她判断这个数独合不合法。
数独是一款逻辑推理类游戏,玩家的任务是用数字 1∼9 填满一个 9×9 的网格,使其满足以下条件:
数字 1∼9 在每一行恰好出现一次。 数字 1∼9 在每一列恰好出现一次。 把网格划分成 9 个 3×3 的宫,数字 1∼9 在每一宫恰好出现一次。 现在给你一个可能未完成的数独网格,请你判断当前是否存在错误。一个网格是存在错误的,当且仅当存在一行或一列或一宫,其中至少一个数字出现了 2 次及以上。
9 行,每行 9 个数字,代表数独中出现的数。 特别的,如果某个数为 0,那么代表这个格子上没有填写数字。
如果这个数独合法,输出 “Happy Chtholly”。 否则,输出 “Refused”。
5 2 0 0 0 0 0 8 1
0 3 9 5 8 0 0 0 0
0 8 0 0 9 0 0 0 0
2 4 0 0 0 0 1 0 3
1 0 0 4 3 0 8 6 0
0 6 3 0 0 7 0 2 4
0 0 0 1 0 9 3 5 0
0 0 8 0 7 4 6 0 0
3 1 0 8 6 0 7 0 9
输出:Happy Chtholly
3 0 0 6 0 0 0 0 4
4 0 9 8 0 1 0 0 7
0 0 7 0 4 9 6 0 0
9 4 6 1 5 7 8 0 2
0 2 0 3 0 0 7 4 5
0 7 0 2 8 0 0 0 0
0 0 0 4 0 0 0 0 5
8 0 5 0 6 0 0 2 0
7 3 4 0 0 8 5 0 0
输出:Refused
我的:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[10][10],c,b[10],d,t,i,j;
void aaa(int x,int y){
if(x>9 || c==1) {
d=1;
return;
}
t=0;
t=a[x][y];
x++;
if(t==0 && d==0) aaa(x,y);
else if(b[t]==0 && d==0){
b[t]=1;
aaa(x,y);
}
else if(b[t]==1 && d==0){
c=1;
return ;
}
}
void bbb(int x,int y){
if(y>9 || c==1) {
d=1;
return;
}
t=0;
t=a[x][y];
y++;
if(t==0 && d==0) bbb(x,y);
else if(b[t]==0 && d==0){
b[t]=1;
bbb(x,y);
}
else if(b[t]==1 && d==0){
c=1;
return ;
}
}
void ccc(int x,int y, int z,int l){
if(x>z || c==1 || d==1) {
d=1;
return ;
}
if(y>l){
x++;
y-=3;
}
t=0;
t=a[x][y];
y++;
if(t==0 && d==0 && x<=z) ccc(x,y,z,l);
else if(b[t]==0 && d==0 && x<=z){
b[t]=1;
ccc(x,y,z,l);
}
else if(b[t]==1 && d==0 && x<=z){
c=1;
return ;
}
}
int main(){
for(ll i=1;i<=9;++i)
for(ll j=1;j<=9;++j)
cin>>a[i][j];
for(ll i=1;i<=9;++i){
d=0;
for(ll j=1;j<=10;++j) b[j]=0;
aaa(1,i);
if(c==1) break;
}
for(ll i=1;i<=9;++i){
d=0;
for(ll j=1;j<=10;++j) b[j]=0;
bbb(i,1);
if(c==1) break;
}
for(ll i=1;i<=9;i+=3){
for(ll j=1;j<=9;j+=3){
d=0;
for(ll k=1;k<=10;++k) b[k]=0;
ccc(i,j,i+2,j+2);
if(c==1) break;
}
}
if(c==1) cout<<"Refused";
else cout<<"Happy Chtholly";
return 0;
}
WA好多,麻烦大佬看看哪里错了T-T