B - Tempter of the Bone(DFS+剪枝)
The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.
InputThe input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give the maze layout, with each line containing M characters. A character is one of the following:
'X': a block of wall, which the doggie cannot enter;
'S': the start point of the doggie;
'D': the Door; or
'.': an empty block.
The input is terminated with three 0's. This test case is not to be processed.
OutputFor each test case, print in one line "YES" if the doggie can survive, or "NO" otherwise.
Sample Input
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0
Sample Output
NO
YES
学到了剪枝的一些知识。
AC代码
1 #include<iostream>
2 #include<cstring>
3 #include<algorithm>
4 #define N 10
5
6 using namespace std;
7
8 int n,m,t,end_i,end_j;
9 bool visited[N][N],flag,ans;
10 char mapp[N][N];
11
12 int abs(int a,int b)
13 {
14 if(a<b) return b-a;
15 else return a-b;
16 }
17
18 void DFS(int i,int j,int c)
19 {
20 if(flag) return ;
21 if(c>t) return ;
22 if(i<0||i>=n||j<0||j>=m) {return ;}
23 if(mapp[i][j]=='D'&&c==t) {flag=ans=true; return ;}
24 int temp=abs(i-end_i)+abs(j-end_j);
25 temp=t-temp-c;
26 if(temp&1) return ;//奇偶剪枝
27
28 if(!visited[i-1][j]&&mapp[i-1][j]!='X')
29 {
30 visited[i-1][j]=true;
31 DFS(i-1,j,c+1);
32 visited[i-1][j]=false;
33 }
34 if(!visited[i+1][j]&&mapp[i+1][j]!='X')
35 {
36 visited[i+1][j]=true;
37 DFS(i+1,j,c+1);
38 visited[i+1][j]=false;
39 }
40 if(!visited[i][j-1]&&mapp[i][j-1]!='X')
41 {
42 visited[i][j-1]=true;
43 DFS(i,j-1,c+1);
44 visited[i][j-1]=false;
45 }
46 if(!visited[i][j+1]&&mapp[i][j+1]!='X')
47 {
48 visited[i][j+1]=true;
49 DFS(i,j+1,c+1);
50 visited[i][j+1]=false;
51 }
52 }
53
54 int main()
55 {
56 int i,j,x,y,k;
57 while(cin>>m>>n>>t&&(m||n||t))
58 {
59 memset(visited,false,sizeof(visited));
60 k=0;
61 for(i=0;i<n;i++)
62 {
63 for(j=0;j<m;j++)
64 {
65 cin>>mapp[i][j];
66 if(mapp[i][j]=='S')
67 {
68 x=i;y=j;
69 visited[i][j]=true;
70 }
71 if(mapp[i][j]=='D')
72 {
73 end_i=i;end_j=j;
74 }
75 if(mapp[i][j]=='X')k++;
76 }
77 }
78 ans=flag=false;
79 if(n*m-k-1>=t) DFS(x,y,0);
80 if(ans) cout<<"YES"<<endl;
81 else cout<<"NO"<<endl;
82 }
83 return 0;
84 }
B - Tempter of the Bone(DFS+剪枝)的更多相关文章
- HDU1010:Tempter of the Bone(dfs+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 //题目链接 http://ycool.com/post/ymsvd2s//一个很好理解剪枝思想的博客 ...
- Tempter of the Bone dfs+剪枝
The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it u ...
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- hdu.1010.Tempter of the Bone(dfs+奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- Tempter of the Bone(dfs奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- M - Tempter of the Bone(DFS,奇偶剪枝)
M - Tempter of the Bone Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- hdu1010 Tempter of the Bone —— dfs+奇偶性剪枝
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 Tempter of the Bone Time Limit: 2000/1000 MS (Ja ...
- HDOJ.1010 Tempter of the Bone (DFS)
Tempter of the Bone [从零开始DFS(1)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1010 Tem ...
- zoj 2110 Tempter of the Bone (dfs)
Tempter of the Bone Time Limit: 2 Seconds Memory Limit: 65536 KB The doggie found a bone in an ...
随机推荐
- 第39天学习打卡(多线程 Thread Runnable 初始并发问题 Callable )
多线程详解 01线程简介 Process与Thread 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念. 进程则是执行程序的一次执行过程,它是一个动态的概念.是系统资源分配的 ...
- MYSQL索引优化法则
目录 一首诗送给各位: 全值匹配我最爱,最左前缀要遵守: 带头大哥不能死,中间兄弟不能断: 索引列上少计算,范围之后全失效: Like百分写最右,覆盖索引不写星: 不等空值还有or,索引失效要少用: ...
- go 在crontab里面运行报错 解决方案
问题背景 你高高兴兴的写好了一个go脚本,放到你的服务器上,打算定期运行这个脚本,你打开crontab -e, 然后输入: */1 * * * * go run /root/test/main.go ...
- 《Selenium自动化测试实战》新书上市,有需要朋友们可以了解下,欢迎大家多提宝贵意见
京东:https://item.jd.com/13123910.html当当:http://product.dangdang.com/29204520.html 1. 本书基于 Python 3.8 ...
- 阅读源码,HashMap回顾
目录 回顾 HashMap简介 类签名 常量 变量 构造方法 tableSizeFor方法 添加元素 putVal方法 获取元素 getNode方法 总结 本文一是总结前面两种集合,补充一些遗漏,再者 ...
- 鸿蒙开源第三方件组件——轮播组件Banner
目录: 1.功能展示 2.Sample解析 3.Library解析 4.<鸿蒙开源第三方组件>系列文章合集 前言 基于安卓平台的轮播组件Banner(https://github.com/ ...
- KL散度相关理解以及视频推荐
以下内容基于对[中字]信息熵,交叉熵,KL散度介绍||机器学习的信息论基础这个视频的理解,请务必先看几遍这个视频. 假设一个事件可能有多种结果,每一种结果都有其发生的概率,概率总和为1,也即一个数据分 ...
- 白嫖微软Azure12个月服务器
前言 Azure是微软提供的一个云服务平台.是全球除了AWS外最大的云服务提供商.Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务.这里的Azure是Azure国 ...
- uwsgi+nginx+virtualenv+supervisor
一.linux安装Python 1.依赖 `yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl ...
- C# 基础 - Json 之间的转换
这里举例两种方式. 1. Newtonsoft.Json.JsonConvert 需要引用外部的 Newtonsoft.Json.dll /// <summary> /// 将json字符 ...