标签:class argc 题目 ble main solution net size memset
题目链接:
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("\n"); } 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("\n"); if(sum==16) dfs(1); if(!Find) printf("No solution possible\n"); } return 0; }
标签:class argc 题目 ble main solution net size memset
原文地址:https://www.cnblogs.com/zhuixunfighting/p/10047002.html