数独(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";
}