Tempter of the Bone(dfs+奇偶剪枝)题解
Tempter of the Bone
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.
'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.
题意:
一个n*m的矩阵,老鼠的起点在矩阵中的'S'上,终点在矩阵中的'D',其中'X'是墙,老鼠不能通过,'.'是路但是只能通过一次,过了一次之后就不能再走这个地方了,终点D在第K秒是打开,这就要求老鼠能够在第K秒是正好到达D点,如果不能就输出NO,可以的话就输出YES.
思路:
用dfs解决,但是如果剪枝没弄好会超时,新学到了一个奇偶剪枝。
奇偶剪枝:从a到b的路径大小永远是 dis=abs(ax-bx)+abs(ay-by)+偶数 。所以以此可以先一步判断
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
#define N 10
using namespace std;
int m,n,t,flag;
char map[N][N];
int vis[N][N],step,to[4][2]={0,1,1,0,-1,0,0,-1};
void dfs(int x,int y){
if(flag) return;
if(map[x][y]=='D' && step==t){
flag=1;
return;
}
if(step>=t) return;
for(int i=0;i<4;i++){
int fx=x+to[i][0],fy=y+to[i][1];
if(fx>=1 && fx<=n && fy>=1 && fy<=m && vis[fx][fy]==0 && map[fx][fy]!='X'){
step+=1;
vis[fx][fy]=1;
dfs(fx,fy);
step-=1;
vis[fx][fy]=0;
}
}
return;
}
int main(){
int sx,sy,ex,ey,i,j;
while(~scanf("%d%d%d",&n,&m,&t) && n+m+t){
for(i=1;i<=n;i++){
scanf("%s",map[i]+1);
for(j=1;j<=m;j++){
if(map[i][j]=='S'){
sx=i,sy=j;
}
if(map[i][j]=='D'){
ex=i,ey=j;
}
}
}
int dis=abs(sx-ex)+abs(sy-ey);
if((dis%2)!=(t%2)){ //奇偶剪枝
printf("NO\n");
continue;
}
memset(vis,0,sizeof(vis));
step=0;
flag=0;
vis[sx][sy]=1;
dfs(sx,sy);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
Tempter of the Bone(dfs+奇偶剪枝)题解的更多相关文章
- Tempter of the Bone(dfs奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- 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 ...
- M - Tempter of the Bone(DFS,奇偶剪枝)
M - Tempter of the Bone Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意: 输入 n m t,生成 n*m 矩阵,矩阵元素由 ‘.’ 'S' 'D' 'X' 四 ...
- hdu Tempter of the Bone (奇偶剪枝)
学习链接:http://www.ihypo.net/1554.html https://www.slyar.com/blog/depth-first-search-even-odd-pruning.h ...
- 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 ...
- hdu1010Tempter of the Bone(dfs+奇偶剪枝)
题目链接:pid=1010">点击打开链接 题目描写叙述:给定一个迷宫,给一个起点和一个终点.问是否能恰好经过T步到达终点?每一个格子不能反复走 解题思路:dfs+剪枝 剪枝1:奇偶剪 ...
- hdu - 1010 Tempter of the Bone (dfs+奇偶性剪枝) && hdu-1015 Safecracker(简单搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 这题就是问能不能在t时刻走到门口,不能用bfs的原因大概是可能不一定是最短路路径吧. 但是这题要过除了细心 ...
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- hdoj--1010<dfs+奇偶剪枝>
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述:在n*m的矩阵中,有一起点和终点,中间有墙,给出起点终点和墙,并给出步数,在该步数情况 ...
随机推荐
- sass和css的calc运算
1.sass不识别不同单位之间的计算,而calc则没问题. width: #{1rem - 2px}; /*出错*/ width: calc(1rem - 2px); 通常情况定制css样式,我不需要 ...
- property:get、set
property属性:自动调用get.set方法 每次调用隐藏的数据,都用get和set方法写的字符太长,就用property解决. 方法一:使用property()函数升级get.set方法 源 ...
- html_parser
import json from lxml import etree class HtmlParser(object): """这是HtmlParser"&qu ...
- JVM学习笔记-内存管理
第一章 内存分配 1. 内存区域. 方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离). 1) java虚拟机栈:线程私有.描写叙述的是java方法执行的内存模 ...
- android奔溃日期一闪而过
Android Studio日期崩溃了一闪而过,看不到原因:可以设置No Filters就可以了
- 主成分分析 PCA算法原理
对同一个体进行多项观察时,必定涉及多个随机变量X1,X2,…,Xp,它们都是的相关性, 一时难以综合.这时就需要借助主成分分析 (principal component analysis)来概括诸多信 ...
- nodejs 将网上的图片下载到本地文件
var request = require('request'); var fs = require('fs'); var img_src = 'https://www.baidu.com/img/b ...
- 找出numpy array数组的最值及其索引
在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...
- 使用TreeView加载XML文件
PS: 由于小弟初学编程,本文只写实现方式,代码写的不是很好请见谅! 1.需要读取的xml文档内容 2. 最终实现效果 3 貌似看起实现起来很复杂 但是想想还是挺简单 思路: 读取XML文档 →获 ...
- 最短路径-----迪杰斯特拉算法(C语言版)
原文:http://blog.csdn.net/mu399/article/details/50903876 转两张思路图非常好: 描述略 图片思路很清晰. Dijkstra不适用负权值,负 ...