NOIP模擬 數獨(大模擬)
阿新 • • 發佈:2018-11-11
傳送門
【題目分析】
道理我都懂。。。。。。但寫錯那麼大一個地方竟然都有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; }