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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM