DFS:Tempter of the Bone (规定时间达到规定地点)
解题心得:
1、注意审题,此题是在规定的时间达到规定的地点,不能早到也不能晚到。并不是最简单的dfs
2、在规定时间达到规定的地点有几个剪枝:
一、公式:所需的步骤 - x相差行 - y相差列 = 偶数。(这个解释很简单,无论怎么走,都可以把走的总路程分解到x方向和y方向,哪怕反向走,走回来后的步骤+反向走的步骤也一定是偶数,假设运用正交分解走到了终点(上面公式),但是步骤没走够,可以以最终的目标点为起点任选两格来回走消耗步骤,但是减去正交分解的步数后若是奇数,那么在终点来回走将步数消耗完之后必然会走出去而不能停留在终点。)
二、总的格数减去墙数一定大于等于所需的步骤
三、当时间超出了所需的时间时要return,并且消除标记。
题目:
Tempter of the Bone
Time Limit :1s
Memory limit :32M
Accepted Submit :305
Total Submit :1026
The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.
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.
Input
The 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.
Output
For 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.
S
…D
0 0 0
Sample Output
NO
YES
#include<stdio.h>
#include<cstring>
#include<iostream>
using namespace std;
char maps[10][10];
int n,m,t,cnt//记录步骤;
int use[10][10],dir[4][2]={0,1,0,-1,1,0,-1,0};
bool flag//标记是否在规定的时间点找到目标;
struct node
{
int x,y;
}aim,now;//记录出口和启动点
int abs(int num)
{
if(num < 0)
return 0-num;
else
return num;
}
void dfs(int x,int y,int cnt)
{
int i,temp;
if(x == aim.x && y == aim.y && t == cnt)
{
flag = true;
printf("YES\n");
return;
}
temp = abs(t-cnt) - (aim.x - x) - (aim.y - y);//这很重要,一定要注意,在时间超出之后要return,。。。。哎!
if(temp<0 || temp%2)
return;
if(x<0 || y<0 || x>=n || y>=m)
return;
for(i=0;i<4;i++)
{
if(use[x+dir[i][0]][y+dir[i][1]] != 1 && maps[x+dir[i][0]][y+dir[i][1]] != 'X')
{
use[x+dir[i][0]][y+dir[i][1]] = 1;
dfs(x+dir[i][0],y+dir[i][1],cnt+1);
if(flag)
return;
use[x+dir[i][0]][y+dir[i][1]] = 0;
}
}
return;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
int d = 0;;
if(n == 0 && m == 0 && t == 0)
break;
cnt = 0;
memset(use,0,sizeof(use));
for(int i=0;i<n;i++)
scanf("%s",maps[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(maps[i][j] == 'D')
{
aim.x = i;
aim.y = j;
}
if(maps[i][j] == 'S')
{
now.x = i;
now.y = j;
}
if(maps[i][j] == 'X')
d++;
}
}
if(m*n - d < t)
{
printf("NO\n");
continue;
}
flag = false;
use[now.x][now.y] = 1;
dfs(now.x,now.y,cnt);
if(!flag)
printf("NO\n");
}
}
DFS:Tempter of the Bone (规定时间达到规定地点)的更多相关文章
- DFS Tempter of the Bone
http://acm.hdu.edu.cn/showproblem.php?pid=1010 用到了奇偶剪枝: 0 1 0 1 1 0 1 0 如图,设起点为s,终点为e,s-> ...
- 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 ...
- 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 ...
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- hdoj 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 ...
- Tempter of the Bone(dfs奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- ZOJ 2110 Tempter of the Bone(条件迷宫DFS,HDU1010)
题意 一仅仅狗要逃离迷宫 能够往上下左右4个方向走 每走一步耗时1s 每一个格子仅仅能走一次且迷宫的门仅仅在t时刻打开一次 问狗是否有可能逃离这个迷宫 直接DFS 直道找到满足条件的路径 ...
- 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 ...
随机推荐
- let和const命令整理
一.let命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. for循环的计数器,就很合适使用let命令. for循环还 ...
- Spring+Hibernateh使用小结
由此我们可以看出,报出错误的地方主要是slf4j的jar包,而故障码中“Failed to load class ’org.slf4j.impl.StaticLoggerBinder‘”的意思则是“加 ...
- 使用腾讯IP分享计划网站中的纯JS省市区三级联动
JS地址:http://ip.qq.com/js/geo.js 实例如下: <!DOCTYPE html> <html> <head> <title>省 ...
- 平时对Vue的总结
1.v-bind和v-on的区别 v-bind绑定的函数是立即执行的 v-on是需要一定触发执行的 2.computed和methods的区别 computed的函数是设置属性的 methods的函数 ...
- 用rem实现h5页面的编写
一 静态页面的布局 将这段代码加到script中 (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orienta ...
- 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)
点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...
- 感谢我的python老师
Python自动化开发(金角大王版) http://www.cnblogs.com/alex3714/articles/5885096.html
- java基础——线程池
第2章 线程池 2.1 线程池概念 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源. 我们详细的解释一下为什么要使用线程池 ...
- 使TextBox的内容换行
首先你把TextBox控件的MultiLine属性设置为True,然后把TextBox控件的Text属性根据程序需要,在需要换行的地方加入\r\n这样就可实现换行了
- java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积
需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法pri ...