數獨(0)
描述
輸入
輸入的記憶碎片A是一個9行9列的數獨矩陣。
每行包含9個數字(均不超過數字爲1-9)。
初始矩陣A:
530070000
600195000
098000060
800060003
400803001
700020006
060000280
000419005
000080079
輸出
如果輸入數據真的是初始矩陣A的解,輸出Yes,否則輸出No
輸入樣例
534678912
672195348
198342567
859761423
426853791
713924856
961537284
287419635
345286179
輸出樣例
yes
解法
判斷成立的條件:
1)輸入的數字與原數獨數字非空的部分要完全相同,且爲1-9
2)每一行每一列每一個小方格不重複
不能把每一行每一列加起來得到的數值比較(1+2+…+9=45)
代碼
#include<bits/stdc++.h>
using namespace std;
char a[10][10]={
{"530070000"},
{"600195000"},
{"098000060"},
{"800060003"},
{"400803001"},
{"700020006"},
{"060000280"},
{"000419005"},
{"000080079"}
};
char b[10][10];
bool check1(){
string aline;
for(int i=0;i<9;i++){
cin>>aline;
if(aline.size()!=9){
// !cout<<"wrong line";
return false;
}
for(int j=0;j<9;j++){
b[i][j] = aline[j]-'0';
if(b[i][j]<1 || b[i][j]>9 || (b[i][j]!=(a[i][j]-'0') && (a[i][j]-'0')!=0) ){
// cout<<"wrong digit";
return false;
}
}
}
return true;
}
bool check2(){
bool isUsed[10];
//判斷每行是不是重複
for(int i=0;i<9;i++){
// for(int j=0;j<10;j++) isUsed[j]=false;
memset(isUsed,false,sizeof(isUsed));
for(int j=0;j<9;j++){
if(isUsed[b[i][j]]==true) return false;
else isUsed[b[i][j]]=true;
}
}
// 判斷每列是不是重複
for(int i=0;i<9;i++){
// for(int j=0;j<10;j++) isUsed[j]=false;
memset(isUsed,false,sizeof(isUsed));
for(int j=0;j<9;j++){
if(isUsed[b[j][i]]==true) return false;
else isUsed[b[j][i]]=true;
}
}
//判斷小方格是不是重複
bool isused[3][3];
for(int i=0;i<9;i+=3)
for(int j=0;j<9;j+=3){
memset(isused,false,sizeof(isused));
for(int i1=0;i1<3;i1++)
for(int j1=0;j1<3;j1++){
if(isused[i1][j1]==true) return false;
else isused[i1][j1]=true;
}
}
return true;
}
int main()
{
if(check1()&&check2())
cout<<"Yes";
else cout<<"No";
}