NOIP模拟 数独(大模拟)
传送门
【题目分析】
道理我都懂。。。。。。但写错那么大一个地方竟然都有70pts。。。。。mmp调错调到爽
按题意模拟即可,没什么思维难度
【代码~】
#include<bits/stdc++.h>
using namespace std;
int sd[101][10][10];
int jgg[101][10][10];
int q;
char s[15];
int Read(){
int i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
int check(int x,int y){
int s1=(x-1)/3+1,s2=(y-1)/3+1;
if(s1==1){
return s2;
}
if(s1==2){
return s2+3;
}
if(s1==3){
return s2+6;
}
return 0;
}
void cop(int x,int y){
for(int i=1;i<=9;++i){
for(int j=1;j<=9;++j){
sd[x][i][j]=sd[y][i][j];
jgg[x][i][j]=jgg[y][i][j];
}
}
}
bool ch(int x,int y,int z,int id){
for(int i=1;i<=9;++i)
if(sd[id][x][i]==z||sd[id][i][y]==z)
return false;
int r=check(x,y);
if(jgg[id][r][z])
return false;
return true;
}
int copp(int x,int y){
int ret=0;
for(int i=1;i<=9;++i){
for(int j=1;j<=9;++j){
if(ch(i,j,sd[y][i][j],x)){
sd[x][i][j]=sd[y][i][j];
ret++;
}
jgg[x][check(i,j)][sd[y][i][j]]=1;
}
}
return ret;
}
int main(){
for(int i=1;i<=19;++i){
scanf("%s",s);
if(!(i&1)){
for(int j=1;j<19;j+=2){
sd[0][i/2][j/2+1]=s[j]-'0';
if(s[j]!='0')
jgg[0][check(i/2,j/2+1)][s[j]-'0']=1;
}
}
}
q=Read();
for(int t=1;t<=q;++t){
char cz[10];
scanf("%s",cz);
if(cz[0]=='I'){
cop(t,t-1);
int x=Read(),y=Read(),z=Read();
if(sd[t][x][y]){
puts("Error!");
continue;
}
else{
int flag1=1,flag2=1,flag3=1;
for(int i=1;i<=9;++i){
if(i==y)
continue;
if(sd[t][x][i]==z){
puts("Error:row!");
flag1=0;
break;
}
}
if(!flag1)
continue;
for(int i=1;i<=9;++i){
if(i==x)
continue;
if(sd[t][i][y]==z){
puts("Error:column!");
flag2=0;
break;
}
}
if(!flag2)
continue;
if(jgg[t][check(x,y)][z]){
puts("Error:square!");
flag3=0;
}
if(!flag3)
continue;
puts("OK!");
sd[t][x][y]=z;
jgg[t][check(x,y)][z]=1;
}
}
if(cz[0]=='D'){
int x=Read(),y=Read();
cop(t,t-1);
if(!sd[t][x][y]){
puts("Error!");
continue;
}
puts("OK!");
jgg[t][check(x,y)][sd[t][x][y]]=0;
sd[t][x][y]=0;
}
if(cz[0]=='Q'){
cop(t,t-1);
int x=Read(),y=Read();
if(sd[t][x][y]){
puts("Error!");
continue;
}
int ok[10];
memset(ok,0,sizeof(ok));
for(int i=1;i<=9;++i){
ok[sd[t][i][y]]=ok[sd[t][x][i]]=1;
}
int id=check(x,y);
for(int i=1;i<=9;++i){
if(jgg[t][id][i])
ok[i]=1;
}
int sum=0;
for(int i=1;i<=9;++i)
if(!ok[i])
sum++;
cout<<sum<<'\n';
for(int i=1;i<=9;++i){
if(!ok[i])
cout<<i<<'\n';
}
}
if(cz[0]=='M'){
int i=Read(),j=Read();
int cnt1=copp(t,i),cnt2=copp(t,j);
cout<<cnt1<<" "<<cnt2<<'\n';
}
if(cz[0]=='P'){
cop(t,t-1);
for(int i=1;i<=19;++i){
if(i&1){
puts("+-+-+-+-+-+-+-+-+-+");
}
else{
for(int j=1;j<=19;++j){
if(j&1)
putchar('|');
else
cout<<sd[t][i/2][j/2];
}
puts("");
}
}
}
}
return 0;
}