解题心得:

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 (规定时间达到规定地点)的更多相关文章

  1. 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-> ...

  2. 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 ...

  3. 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 ...

  4. HDU 1010 Tempter of the Bone --- DFS

    HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...

  5. 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 ...

  6. Tempter of the Bone(dfs+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. Tempter of the Bone(dfs奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. ZOJ 2110 Tempter of the Bone(条件迷宫DFS,HDU1010)

    题意  一仅仅狗要逃离迷宫  能够往上下左右4个方向走  每走一步耗时1s  每一个格子仅仅能走一次且迷宫的门仅仅在t时刻打开一次  问狗是否有可能逃离这个迷宫 直接DFS  直道找到满足条件的路径 ...

  9. 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 ...

随机推荐

  1. springboot相关的pom依赖文件

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  2. cucumber的疑问解答

    在cucumber的自动化测试框架下面,在一个steps文件中定义的@page对象,可以在其他的不同的steps文件中调用,在整个的场景生命周期中都是有效的 原因:cucumber开始执行时,一次性把 ...

  3. java反射-使用反射获取类的所有信息

    在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...

  4. spring的工厂方法

    http://blog.csdn.net/nvd11/article/details/51542360

  5. java - Socket简单编程实践

    1.简介: 1)SOCKET是应用程序和网络之间的一个接口.SOCKET创建设置好以后,应用程序可以: 通过网络把数据发送到socket . 通过网络从socket接收数据.(通信的前提是应用程序知道 ...

  6. chart.js 使用方法 特别说明不是中文的

    以上是一个饼图的案例,其他统计类型查看文档 http://www.chartjs.org/docs/latest/charts/doughnut.html 注意看域名 chartjs.org  不是 ...

  7. angular 学习笔记(1) 使用angular完整写法

    视图部分: <div ng-app="myapp"> <div ng-controller="myctrl"> <p>{{n ...

  8. android获取https证书

    最近碰到一个问题, 有朋友问android这边能不能拿到服务器下发的证书,意思就是   自签名证书的https接口,在请求的时候,也没有添加自签名证书进信任列表,直接去发https请求,按照正常htt ...

  9. Cocos2d-x v3.1 核心类Director,Scene,Layer和Sprite(六)

    Cocos2d-x v3.1 核心类Director,Scene,Layer和Sprite(六) Scene就像一个舞台一样在上面会摆放各种的元素,有的是固定的比如说布景,道具都是固定不动的,但有的元 ...

  10. System Center Configuration Manager 2016 域准备篇(Part2)

    对于" 服务器角色",请选择" Active Directory域服务",当系统提示您添加Active Directory域服务所需的功能时,请选择" ...