题意:每行每列都有1234,划分成4个2*2的小块,每个小块也有1234
思路:搜索+回溯
AC代码:
[cpp] view plain copy #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<utility> #include<set> #include<vector> #include<map> #include<queue> #include<stack> #define maxn 1010 #define INF 0x3f3f3f3f #define LL long long #define ULL unsigned long long #define E 1e-8 #define mod 1000000007 #define P pair<int,int> using namespace std; struct node { int x,y; }f[20]; int t; char a[10][10]; int ans; bool flag; map<char,int>m; /*bool check() { for(int i=0;i<4;i++){ m.clear(); for(int j=0;j<4;j++){ if(m[a[i][j]]){ return false; } m[a[i][j]]++; } } for(int i=0;i<4;i++){ m.clear(); for(int j=0;j<4;j++){ if(m[a[j][i]]){ return false; } m[a[j][i]]++; } } for(int k=0;k<4;k++){ m.clear(); for(int i=(k/2)*2;i<(k/2)*2+2;i++){ for(int j=(k%2)*2;j<(k%2)*2+2;j++){ if(m[a[i][j]]){ return false; } m[a[i][j]]++; } } } }*/ bool check(int x,int y,char s) { for(int i=0;i<4;i++){ if(a[x][i]==s) return false; if(a[i][y]==s) return false; } for(int i=(x/2)*2;i<(x/2)*2+2;i++){ for(int j=(y/2)*2;j<(y/2)*2+2;j++){ if(a[i][j]==s) return false; } } return true; } void dfs(int step) { if(step==ans){ for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ printf("%c",a[i][j]); } printf("\n"); } flag=true; return; } int x=f[step].x; int y=f[step].y; for(int i=1;i<=4&&!flag;i++){ char ss='0'+i; if(check(x,y,ss)){ a[x][y]=ss; //cout<<a[x][y]<<endl; dfs(step+1); a[x][y]='*'; } } } int main() { scanf("%d",&t); getchar(); int cas=0; while(t--){ // getchar(); ans=0; for(int i=0;i<4;i++){ scanf("%s",a[i]); for(int j=0;j<4;j++){ if(a[i][j]=='*'){ f[ans].x=i; f[ans++].y=j; } } } flag=false; printf("Case #%d:\n",++cas); dfs(0); } return 0; }