Tempter of the Bone

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Problem Description
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.
...D
0 0 0
 
Sample Output
NO
YES
 
题目大意:
      输入一个n*m的迷宫,和一个时间t(代表可以在迷宫中生存的最长时间,可以理解为超过时间t迷宫将会坍塌,人也会死亡),
      迷宫有一个出口,这个出口只会在第t秒的时候打开,并且人每走一步,走过的道路就会坍塌,迷宫中还有一些墙,人是不能通过的。
      问:一个人从起始地点能否刚好在第t秒的时候到达出口。
 
解题思路:
      总体思路为 dfs+剪枝  因为最后问能否刚好在第t秒到达出口,所以需要搜索所有能够走的路程,寻找是否有满足条件的情况。
      但是深搜特别费时间,直接暴力搜索一定是会超时的,所以需要通过剪枝来缩短搜索的时间。
 
      首先想到的第一个剪枝是:当剩余的最小步数 > 剩余的时间时 最后是无法在第t秒到达出口的。
      接下来需要用到的一个剪枝为:奇偶剪枝
 
奇偶剪枝:
      我们可以定义一个map数组来表示每个点的奇偶性(每个点的奇偶性为该点横纵坐标的和)
      0 1 0 1 0 1 
      1 0 1 0 1 0

      0 1 0 1 0 1 
      1 0 1 0 1 0 
      0 1 0 1 0 1 
      有这个表可以发现 从为0的格子走一步,必然走向为1的格子;同样从为1的格子走一步,必然走向为0的格子.
      即 0-->1或1-->0 必然是奇数步       0-->0或1-->1 必然是偶数步 
      so~ 当遇到从0走到0但是要求奇数步、或者从1走到0但是要求偶数步,都可以之间判断不能到达。
      应用到这个题上就是:判断剩余时间和剩余的最小步数的奇偶性是否相同。相同则有可能到达、不同则一定不能到达。
      (奇数-偶数 = 奇数    奇数-奇数= 偶数    偶数-偶数=偶数)
 
AC代码:
 #include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std; char p[][];
int a[][] = {-,,,,,,,-}; // 方向数组
int flag; // 标记是否能够在第t秒时到达出口
int n,m,t;
int sx,sy,dx,dy; // 起始地点 和 出口的地点 void dfs(int x,int y,int k)
{
int i;
if (x< || y< || x>n || y>m) // 判断是否超出边界
return ;
if (k == &&x == dx && y==dy) // 如果刚好在第t秒时到达出口 flag = 1
{
flag = ;
return ;
}
int tmp = k - abs(x-dx)-abs(y-dy);
if (tmp < || tmp&) // 判断 1、是否剩余的最小步数 > 剩余的时间 2、剩余时间和剩余的最小步数的奇偶性是否相同
return ; for (i = ; i < ; i ++)
{
if (p[x+a[i][]][y+a[i][]] != 'X') // 如果时墙则不能通过
{
p[x+a[i][]][y+a[i][]] = 'X'; // 走过之后路就坍塌了(之后不能在通过)
dfs(x+a[i][],y+a[i][],k-);
if (flag) return ; // 如果满足条件直接退出
p[x+a[i][]][y+a[i][]] = '.'; // 当前搜的这条路可能不满足条件 下次再搜别的路时要恢复原样
}
}
return ;
}
int main ()
{
int i,j;
while (scanf("%d%d%d",&n,&m,&t)!=EOF)
{
getchar();
int sum = ;
if (n==&&m==&&t==)
break;
for (i = ; i <= n; i ++)
{
for (j = ; j <= m; j ++)
{
scanf("%c",&p[i][j]);
if (p[i][j] == 'S'){sx = i; sy = j;}
else if (p[i][j] == 'D'){dx = i; dy = j;}
else if (p[i][j] == 'X') sum ++;
}
getchar();
} if (n*m-sum <= t) // 如果可以走的路的步数小于t 直接pass
{
printf("NO\n");
continue;
}
p[sx][sy] = 'X'; // 出发之后不能再回到起点
flag = ;
dfs(sx,sy,t);
if (flag)
printf("YES\n");
else
printf("NO\n");
}
return ;
}     
 

hdu 1010 Tempter of the Bone(dfs)的更多相关文章

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

  2. HDU 1010 Tempter of the Bone (DFS+剪枝)

    题意:从S走到D,能不能恰好用T时间. 析:这个题时间是恰好,并不是少于T,所以用DFS来做,然后要剪枝,不然会TEL,我们这样剪枝,假设我们在(x,y),终点是(ex,ey), 那么从(x, y)到 ...

  3. hdu 1010 Tempter of the Bone(dfs暴力)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

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

  5. hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)

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

  6. ZOJ 2110 Tempter of the Bone(DFS)

    点我看题目 题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO. 思路 :DFS一下就可以,不过要注意下一终止条 ...

  7. HDU 1010 Tempter of the Bone(深度+剪枝)

    http://acm.hdu.edu.cn/showproblem.php?pid=1010 题意:就是给出了一个迷宫,小狗必须经过指定的步数到达出口,并且每个格子只能走一次. 首先先来介绍一下奇偶性 ...

  8. HDU 1010 Tempter of the Bone (广搜+减枝)

    题目链接 Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. How ...

  9. hdu 1010 Tempter of the Bone (奇偶性剪枝)

    题意:有一副二维地图'S'为起点,'D'为终点,'.'是可以行走的,'X'是不能行走的.问能否只走T步从S走到D? 题解:最容易想到的就是DFS暴力搜索,,但是会超时...=_=... 所以,,要有其 ...

随机推荐

  1. POJ_3264 Balanced Lineup 【线段树 + 区间查询】

    一.题面 POJ3264 二.分析 典型的线段树的题,没有更新只有查询. 查询的时候需要注意的是,在判断区间是完全属于右子树还是左子树时,要根据建树的情况来选择,不然会出错.具体看代码 三.AC代码 ...

  2. JobScheduler布置后台任务以及实现进程保活?

    1.简介 在Android 5.0 提供了一套新的 JobScheduler API,它允许您定义要在以后的某个时间或在指定的条件下(例如,当设备在充电时)异步运行的作业来优化电池寿命. https: ...

  3. 使用vmtools来设置windows和linux的共享文件夹

    目的:通过vmtools来实现windows和linux的共享文件夹 步骤: 1.前提条件是vmtools已经安装 2.在windows任意磁盘新建一个共享文件夹 3.进入虚拟机->设置-> ...

  4. overload_protect_config.txt

    overload_protection_switch=Y reject_uri_list= reject_request_percent=50 period_time=10 period_max_fa ...

  5. java BufferedImage 合成多张图片 - 因为JPEGImageEncoder 不能用

    java BufferedImage 合成多张图片 public void createPicTwo2(int x,int y) {     try     {       //读取第一张图片    ...

  6. cadence help文件库调出指令 :cdnshelp

    cadence help文件库调出指令 :cdnshelp 指令参数记录: Verilog 添加可编译文件后缀名 -vlog_ext +.h,.vh Verilog1995 添加可编译文件后缀名 -v ...

  7. Oracle 通过数据字典查询系统信息

    简介:数据字典记录了数据库系统的信息,他是只读表和视图的集合,数据字典的所有者是sys用户.注:用户只能在数据字典上执行查询操作,而维护和修改是由系统自己完成的. 1.数据字典的组成:数据字典包括数据 ...

  8. Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)

    最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分析(必须要弄清楚自己的目的),另外就是要考虑对爬取的数据归类,存储. ...

  9. 【Qt开发】01-第一个Qt程序Hello World!

    一:说在前头 我的第一份工作是做生产工具,当时用的MFC,IDE是VC6.0,现在想想真是古董级别,10年至今,微软也一直没有对MFC进行升级, 冥冥中感觉微软自己都放弃MFC了,市场上貌似MFC的岗 ...

  10. linux信息查看手记

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...