UVA - 387 A Puzzling Problem
Posted zhuixunfighting
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA - 387 A Puzzling Problem相关的知识,希望对你有一定的参考价值。
题目链接:
https://vjudge.net/problem/UVA-387
思路:
非常有意思的拼图,深搜+回溯,
输出硬伤:除了第一次之外,每次先输空格,再输出结果,
以及可能给的数据拼不成4*4表格的情况。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int vis[5][5]; int g[10010][5][5]; int maze[10010][2]; int sum=0; int n; int Find=0,Case=0; void dfs(int cur){ if(cur==n+1){// Find=1; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ printf("%d",vis[i][j]); } printf(" "); } return; } if(Find) return; for(int i=0;i<=4-maze[cur][0];i++){//4*4表格起点横坐标 for(int j=0;j<=4-maze[cur][1];j++){//4*4表格起点纵坐标 int flag=0;//判重 for(int p=0;p<maze[cur][0];p++){ for(int q=0;q<maze[cur][1];q++){ if(!flag&&!vis[i+p][j+q]&&g[cur][p][q]==1) vis[i+p][j+q]=cur; else if(!flag&&g[cur][p][q]==0) continue; else flag=1; } } if(!flag) dfs(cur+1); if(Find) return; for(int p=0;p<4;p++){//重新扫描一遍表格,将上一次的清零 for(int q=0;q<4;q++){ if(vis[p][q]==cur) vis[p][q]=0; } } } } } void init(){ memset(vis,0,sizeof(vis)); memset(g,0,sizeof(g)); memset(maze,0,sizeof(maze)); sum=0; Find=0; Case++; } int main(int argc, char** argv) { while(scanf("%d",&n)!=EOF){ if(n==0) break; init(); for(int i=1;i<=n;i++){ scanf("%d %d",&maze[i][0],&maze[i][1]); string line; for(int j=0;j<maze[i][0];j++){ cin>>line; for(int k=0;k<maze[i][1];k++){ g[i][j][k]=line[k]-‘0‘; sum+=g[i][j][k];//有可能根本拼不成 } } } if(Case!=1) printf(" "); if(sum==16) dfs(1); if(!Find) printf("No solution possible "); } return 0; }
以上是关于UVA - 387 A Puzzling Problem的主要内容,如果未能解决你的问题,请参考以下文章
java https://uva.onlinejudge.org/index.php?option=onlinejudge&Itemid=99999999&page=show_prob
java https://uva.onlinejudge.org/index.php?option=onlinejudge&Itemid=99999999&page=show_prob
[DLX精确覆盖] hdu 1603 A Puzzling Problem