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 }
UVA - 387 A Puzzling Problem的更多相关文章
- uva 387 A Puzzling Problem (回溯)
A Puzzling Problem The goal of this problem is to write a program which will take from 1 to 5 puzz ...
- UVa 101 The Blocks Problem Vector基本操作
UVa 101 The Blocks Problem 一道纯模拟题 The Problem The problem is to parse a series of commands that inst ...
- uva387 - A Puzzling Problem
A Puzzling Problem The goal of this problem is to write a program which will take from 1 to 5 puzzle ...
- 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem
UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...
- UVA - 524 Prime Ring Problem(dfs回溯法)
UVA - 524 Prime Ring Problem Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & % ...
- uva 10837 - A Research Problem(欧拉功能+暴力)
题目链接:uva 10837 - A Research Problem 题目大意:给定一个phin.要求一个最小的n.欧拉函数n等于phin 解题思路:欧拉函数性质有,p为素数的话有phip=p−1; ...
- UVA 810 - A Dicey Problem(BFS)
UVA 810 - A Dicey Problem 题目链接 题意:一个骰子,给你顶面和前面.在一个起点,每次能移动到周围4格,为-1,或顶面和该位置数字一样,那么问题来了,骰子能不能走一圈回到原地, ...
- UVA 10026 Shoemaker's Problem 鞋匠的难题 贪心+排序
题意:鞋匠一口气接到了不少生意,但是做鞋需要时间,鞋匠只能一双一双地做,根据协议每笔生意如果拖延了要罚钱. 给出每笔生意需要的天数和每天的罚钱数,求出最小罚钱的排列顺序. 只要按罚款/天数去从大到小排 ...
- UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。
/** 题目:UVA 1640 The Counting Problem UVA1640 链接:https://vjudge.net/problem/UVA-1640 题意:求[a,b]或者[b,a] ...
随机推荐
- 二、Linux文件系统结构
为了方便管理文件和目录,Linux 系统将它们组织成一个以根目录 / 开始的倒置的树状结构.Linux 中的目录,和 Windows 系统中的文件夹类似,不同之处在于,Linux 系统中的目录也被当做 ...
- 跨站点脚本编制 - SpringBoot配置XSS过滤器(基于Jsoup)
1. 跨站点脚本编制 风险:可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务. 原因:未对用户输入正确执行危险字符清 ...
- [日常摸鱼]HDU2157 How many ways??
hhh我又开始水题目了 题意:给一张有向图,多次询问一个点到另一个点刚好走$k$步的方案数取模,点数很小 每个$a,b,k$的询问直接把邻接矩阵$map$自乘$k$次后$map[a][b]$就是答案了 ...
- 【Go语言绘图】图片添加文字(二)
这一篇将继续介绍gg库中绘制文字相关的方法,主要包括:DrawStringAnchored().DrawStringWrapped().MeasureMultilineString().WordWra ...
- ASP.NET Core 3.1使用log4net/nlog/Serilog记录日志
Serilog中的结构化日志支持非常好,而且配置简便.我能够比其他任何人更轻松地启动和运行Seirlog.Serilog中的日志可以发送到很多目的地.Serilog称这些东西为"接收器&qu ...
- IIS本地部署局域网可随时访问的项目
原理 在本机的IIS下创建一个网站,文件目录直接指向Web项目文件夹 步骤 1.项目的启动项目为web 2.在iis中创建一个新的网站(Work_TK_EIS) 文件目录为web项目的目录(D:\Gi ...
- 任务调度框架Quartz快速入门!
目录 Quartz是什么 Quartz中的重要API及概念 超重要API 重要概念 Quartz设计理念:为什么设计Job和Trigger? 最简单的Quartz使用案例 Job实例和JobDetai ...
- Ubuntu不能直接从windows复制粘贴文件或文字
终端输入: apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools-desktop 然后重启电脑就可以了. 参考链接:h ...
- [LeetCode]172. Factorial Trailing Zeroes阶乘尾随0的个数
所有的0都是有2和45相乘得'到的,而在1-n中,2的个数是比5多的,所以找5的个数就行 但是不要忘了25中包含两个5,125中包含3个5,以此类推 所以在找完1-n中先找5,再找25,再找125.. ...
- java键盘输入方法-
字符串缓冲方式 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String line = null ...