数 独
【问题描述】
给定一个9*9矩阵,对其进行几种操作,分别是插入,删除,合并,查询,输出
主要学到了一些特别的操作。
(1)备份( 本蒟蒻第一次了解到)
(2)对与数据的一些特别的改动
(3)进行标记
这道题目,直接模拟就可以了,但要注意细节以及一些很妙的操作:
首先是字符组的存入:注意将其他的字符进行排除:
1 for(int i=1;i<=19;i++){
2 cin>>s; 3 if(i&1)continue;//奇数 4 for(int j=1;j<=9;j++) 5 c[0][i/2][j]=s[j*2-1]; 6 }
然后就是分类讨论:
char c[105][10][10];//前面用于备份每一次操作后的数独(第一次看到这种操作,太强了)
cin>>T; for(int i=1;i<=T;i++){ cin>>s; if(s[0]=='I')x=in,y=in,k=in,insert(i,x,y,k);//in:快读{i记录每一次操作} else if(s[0]=='D')x=in,y=in,del(i,x,y); else if(s[0]=='Q')x=in,y=in,query(i,x,y); else if(s[0]=='M')x=in,y=in,merge(i,x,y); else print(i); }
1:插入:
1 void insert(int n,int x,int y,int k){
2 for(int i=1;i<=9;i++) 3 for(int j=1;j<=9;j++) 4 c[n][i][j]=c[n-1][i][j];//备份 5 if(c[n][x][y]!='0'){ 6 cout<<"Error!"<<endl; 7 return; 8 } 9 for(int i=1;i<=9;i++) 10 if(c[n][x][i]==k+'0'){ 11 cout<<"Error:row!"<<endl; 12 return;//冲突1 13 } 14 for(int i=1;i<=9;i++) 15 if(c[n][i][y]==k+'0'){ 16 cout<<"Error:column!"<<endl; 17 return;//冲突2 18 } 19 int gg=(x-1)/3*3+(y-1)/3+1; 20 for(int i=0;i<=2;i++) 21 for(int j=0;j<=2;j++) 22 if(c[n][i+xs[gg]][j+ys[gg]]==k+'0'){ 23 cout<<"Error:square!"<<endl; 24 return;//冲突3 25 } 26 cout<<"OK!"<<endl; 27 c[n][x][y]=k+'0'; 28 }
2:删除:
1 void del(int n,int x,int y){
2 for(int i=1;i<=9;i++) 3 for(int j=1;j<=9;j++) 4 c[n][i][j]=c[n-1][i][j];//注意备份 5 if(c[n][x][y]=='0') 6 cout<<"Error!"<<endl; 7 else{ 8 cout<<"OK!"<<endl; 9 c[n][x][y]='0'; 10 } 11 }
3:查询:
1 int can[10],ans;
2 void query(int n,int x,int y){ 3 for(int i=1;i<=9;i++) 4 for(int j=1;j<=9;j++) 5 c[n][i][j]=c[n-1][i][j]; 6 if(c[n][x][y]!='0'){cout<<"Error!"<<endl;} 7 memset(can,0,sizeof(can));ans=0; 8 int gg=(x-1)/3*3+(y-1)/3+1; 9 for(int i=1;i<=9;i++) 10 can[c[n][x][i]-'0']=1; 11 for(int i=1;i<=9;i++) 12 can[c[n][i][y]-'0']=1; 13 for(int i=0;i<=2;i++) 14 for(int j=0;j<=2;j++) 15 can[c[n][i+xs[gg]][j+ys[gg]]-'0']=1;//记录不满足的数(因为冲突) 16 for(int i=1;i<=9;i++) 17 if(!can[i]) ans++; 18 cout<<ans<<endl; 19 for(int i=1;i<=9;i++) 20 if(!can[i]) cout<<i<<endl; 21 }
4:合并:
1 int ansx,ansy;
2 void merge(int n,int x,int y){ 3 for(int i=1;i<=9;i++) 4 for(int j=1;j<=9;j++){ 5 int flag=0; 6 if(c[x][i][j]!='0'){ 7 flag=1; 8 for(int k=1;k<=9;k++) 9 if(c[n][i][k]==c[x][i][j]){ 10 flag=0;break; 11 } 12 for(int k=1;k<=9;k++) 13 if(c[n][k][j]==c[x][i][j]){ 14 flag=0;break; 15 } 16 int wh=(i-1)/3*3+(j-1)/3+1; 17 for(int l=0;l<=2;l++) 18 for(int r=0;r<=2;r++) 19 if(c[n][l+xs[wh]][r+ys[wh]]==c[x][i][j]){ 20 flag=0;break; 21 } 22 } 23 if(flag){ 24 c[n][i][j]=c[x][i][j]; 25 ansx++; 26 continue; 27 } 28 if(c[y][i][j]!='0'){ 29 flag=1; 30 for(int k=1;k<=9;k++) 31 if(c[n][i][k]==c[y][i][j]){ 32 flag=0;break; 33 } 34 for(int k=1;k<=9;k++) 35 if(c[n][k][j]==c[y][i][j]){ 36 flag=0;break; 37 } 38 int wh=(i-1)/3*3+(j-1)/3+1; 39 for(int l=0;l<=2;l++) 40 for(int r=0;r<=2;r++) 41 if(c[n][l+xs[wh]][r+ys[wh]]==c[y][i][j]){ 42 flag=0;break; 43 } 44 } 45 if(flag){ 46 c[n][i][j]=c[y][i][j]; 47 ansy++; 48 continue; 49 } 50 c[n][i][j]='0'; 51 } 52 cout<<ansx<<" "<<ansy<<endl; 53 ansx=0,ansy=0;//注意多次操作要恢复 54 }
总代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define int long long
4 #define in read()
5 inline int read(){ 6 int p=0,f=1; 7 char c=getchar(); 8 while(!isdigit(c)){ 9 if(c=='-')f=-1; 10 c=getchar(); 11 } 12 while(isdigit(c)){ 13 p=p*10+c-'0'; 14 c=getchar(); 15 } 16 return p*f; 17 } 18 char c[105][10][10]; 19 string s; 20 int xs[10]={0,1,1,1,4,4,4,7,7,7}; 21 int ys[10]={0,1,4,7,1,4,7,1,4,7}; 22 void insert(int n,int x,int y,int k){ 23 for(int i=1;i<=9;i++) 24 for(int j=1;j<=9;j++) 25 c[n][i][j]=c[n-1][i][j]; 26 if(c[n][x][y]!='0'){ 27 cout<<"Error!"<<endl; 28 return; 29 } 30 for(int i=1;i<=9;i++) 31 if(c[n][x][i]==k+'0'){ 32 cout<<"Error:row!"<<endl; 33 return; 34 } 35 for(int i=1;i<=9;i++) 36 if(c[n][i][y]==k+'0'){ 37 cout<<"Error:column!"<<endl; 38 return; 39 } 40 int gg=(x-1)/3*3+(y-1)/3+1; 41 for(int i=0;i<=2;i++) 42 for(int j=0;j<=2;j++) 43 if(c[n][i+xs[gg]][j+ys[gg]]==k+'0'){ 44 cout<<"Error:square!"<<endl; 45 return; 46 } 47 cout<<"OK!"<<endl; 48 c[n][x][y]=k+'0'; 49 } 50 void del(int n,int x,int y){ 51 for(int i=1;i<=9;i++) 52 for(int j=1;j<=9;j++) 53 c[n][i][j]=c[n-1][i][j]; 54 if(c[n][x][y]=='0')cout<<"Error!"<<endl; 55 else{cout<<"OK!"<<endl;c[n][x][y]='0';} 56 } 57 int can[10],ans; 58 void query(int n,int x,int y){ 59 for(int i=1;i<=9;i++) 60 for(int j=1;j<=9;j++) 61 c[n][i][j]=c[n-1][i][j]; 62 if(c[n][x][y]!='0'){cout<<"Error!"<<endl;} 63 memset(can,0,sizeof(can));ans=0; 64 int gg=(x-1)/3*3+(y-1)/3+1; 65 for(int i=1;i<=9;i++) 66 can[c[n][x][i]-'0']=1; 67 for(int i=1;i<=9;i++) 68 can[c[n][i][y]-'0']=1; 69 for(int i=0;i<=2;i++) 70 for(int j=0;j<=2;j++) 71 can[c[n][i+xs[gg]][j+ys[gg]]-'0']=1; 72 for(int i=1;i<=9;i++) 73 if(!can[i]) ans++; 74 cout<<ans<<endl; 75 for(int i=1;i<=9;i++) 76 if(!can[i]) cout<<i<<endl; 77 } 78 int ansx,ansy; 79 void merge(int n,int x,int y){ 80 for(int i=1;i<=9;i++) 81 for(int j=1;j<=9;j++){ 82 int flag=0; 83 if(c[x][i][j]!='0'){ 84 flag=1; 85 for(int k=1;k<=9;k++) 86 if(c[n][i][k]==c[x][i][j]){ 87 flag=0;break; 88 } 89 for(int k=1;k<=9;k++) 90 if(c[n][k][j]==c[x][i][j]){ 91 flag=0;break; 92 } 93 int wh=(i-1)/3*3+(j-1)/3+1; 94 for(int l=0;l<=2;l++) 95 for(int r=0;r<=2;r++) 96 if(c[n][l+xs[wh]][r+ys[wh]]==c[x][i][j]){ 97 flag=0;break; 98 } 99 } 100 if(flag){ 101 c[n][i][j]=c[x][i][j]; 102 ansx++; 103 continue; 104 } 105 if(c[y][i][j]!='0'){ 106 flag=1; 107 for(int k=1;k<=9;k++) 108 if(c[n][i][k]==c[y][i][j]){ 109 flag=0;break; 110 } 111 for(int k=1;k<=9;k++) 112 if(c[n][k][j]==c[y][i][j]){ 113 flag=0;break; 114 } 115 int wh=(i-1)/3*3+(j-1)/3+1; 116 for(int l=0;l<=2;l++) 117 for(int r=0;r<=2;r++) 118 if(c[n][l+xs[wh]][r+ys[wh]]==c[y][i][j]){ 119 flag=0;break; 120 } 121 } 122 if(flag){ 123 c[n][i][j]=c[y][i][j]; 124 ansy++; 125 continue; 126 } 127 c[n][i][j]='0'; 128 } 129 cout<<ansx<<" "<<ansy<<'\n'; 130 ansx=0,ansy=0; 131 } 132 void print(int n){ 133 for(int i=1;i<=9;i++) 134 for(int j=1;j<=9;j++) 135 c[n][i][j]=c[n-1][i][j]; 136 for(int i=1;i<=9;i++){ 137 cout<<"+-+-+-+-+-+-+-+-+-+"<<endl; 138 for(int j=1;j<=9;j++) 139 cout<<"|"<<c[n][i][j]; 140 cout<<"|"<<endl; 141 } 142 cout<<"+-+-+-+-+-+-+-+-+-+\n"; 143 } 144 int T,x,y,k; 145 signed main(){ 146 for(int i=1;i<=19;i++){ 147 cin>>s; 148 if(i&1)continue;//奇数 149 for(int j=1;j<=9;j++) 150 c[0][i/2][j]=s[j*2-1]; 151 } 152 T=in; 153 for(int i=1;i<=T;i++){ 154 cin>>s; 155 if(s[0]=='I')x=in,y=in,k=in,insert(i,x,y,k); 156 else if(s[0]=='D')x=in,y=in,del(i,x,y); 157 else if(s[0]=='Q')x=in,y=in,query(i,x,y); 158 else if(s[0]=='M')x=in,y=in,merge(i,x,y); 159 else print(i); 160 } 161 return 0; 162 }