返回顶部

2021.11.2-测试T1数独

痛苦

题目

数 独

【问题描述】

给定一个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 }
posted @ 2021-11-04 20:09  gyc#66ccff  阅读(462)  评论(0编辑  收藏  举报