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 }

 

posted @ 2018-11-30 22:47  xzhws  阅读(145)  评论(0编辑  收藏  举报