UVA - 387 A Puzzling Problem
题目链接:
https://vjudge.net/problem/UVA-387
思路:
非常有意思的拼图,深搜+回溯,
输出硬伤:除了第一次之外,每次先输空格,再输出结果,
以及可能给的数据拼不成4*4表格的情况。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int vis[5][5]; 6 int g[10010][5][5]; 7 int maze[10010][2]; 8 int sum=0; 9 int n; 10 int Find=0,Case=0; 11 void dfs(int cur){ 12 if(cur==n+1){// 13 Find=1; 14 for(int i=0;i<4;i++){ 15 for(int j=0;j<4;j++){ 16 printf("%d",vis[i][j]); 17 } 18 printf("\n"); 19 } 20 return; 21 } 22 if(Find) return; 23 for(int i=0;i<=4-maze[cur][0];i++){//4*4表格起点横坐标 24 for(int j=0;j<=4-maze[cur][1];j++){//4*4表格起点纵坐标 25 int flag=0;//判重 26 for(int p=0;p<maze[cur][0];p++){ 27 for(int q=0;q<maze[cur][1];q++){ 28 if(!flag&&!vis[i+p][j+q]&&g[cur][p][q]==1) 29 vis[i+p][j+q]=cur; 30 else if(!flag&&g[cur][p][q]==0) 31 continue; 32 else 33 flag=1; 34 } 35 } 36 if(!flag) dfs(cur+1); 37 38 if(Find) return; 39 for(int p=0;p<4;p++){//重新扫描一遍表格,将上一次的清零 40 for(int q=0;q<4;q++){ 41 if(vis[p][q]==cur) 42 vis[p][q]=0; 43 } 44 } 45 } 46 } 47 } 48 void init(){ 49 memset(vis,0,sizeof(vis)); 50 memset(g,0,sizeof(g)); 51 memset(maze,0,sizeof(maze)); 52 sum=0; 53 Find=0; 54 Case++; 55 } 56 int main(int argc, char** argv) { 57 while(scanf("%d",&n)!=EOF){ 58 if(n==0) break; 59 init(); 60 61 for(int i=1;i<=n;i++){ 62 scanf("%d %d",&maze[i][0],&maze[i][1]); 63 string line; 64 65 for(int j=0;j<maze[i][0];j++){ 66 cin>>line; 67 for(int k=0;k<maze[i][1];k++){ 68 g[i][j][k]=line[k]-'0'; 69 sum+=g[i][j][k];//有可能根本拼不成 70 } 71 } 72 } 73 if(Case!=1) printf("\n"); 74 if(sum==16) 75 dfs(1); 76 if(!Find) printf("No solution possible\n"); 77 } 78 return 0; 79 }