hdu 1010 Tempter of the Bone(dfs)
Tempter of the Bone
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
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.
#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)的更多相关文章
- 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+剪枝)
题意:从S走到D,能不能恰好用T时间. 析:这个题时间是恰好,并不是少于T,所以用DFS来做,然后要剪枝,不然会TEL,我们这样剪枝,假设我们在(x,y),终点是(ex,ey), 那么从(x, y)到 ...
- hdu 1010 Tempter of the Bone(dfs暴力)
Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...
- 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(深搜+奇偶剪枝)
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)
点我看题目 题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO. 思路 :DFS一下就可以,不过要注意下一终止条 ...
- HDU 1010 Tempter of the Bone(深度+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 题意:就是给出了一个迷宫,小狗必须经过指定的步数到达出口,并且每个格子只能走一次. 首先先来介绍一下奇偶性 ...
- HDU 1010 Tempter of the Bone (广搜+减枝)
题目链接 Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. How ...
- hdu 1010 Tempter of the Bone (奇偶性剪枝)
题意:有一副二维地图'S'为起点,'D'为终点,'.'是可以行走的,'X'是不能行走的.问能否只走T步从S走到D? 题解:最容易想到的就是DFS暴力搜索,,但是会超时...=_=... 所以,,要有其 ...
随机推荐
- iframe自适应高度,多层嵌套iframe自适应高度的解决方法
在页面无刷新更新方面,虽然现在的ajax很强悍,但是处理代码相对多点.想比之下,iframe就简单多了!处理iframe的自适应宽.高,会经常用到,网上整理了一份,写在这里备用: 单个iframe 高 ...
- document.referrer和history.go(-1)退回上一页区别
javascript:location=document.referrer;和javascript:history.go(-1);区别: 返回上一页,在PC端我们可以使用:history.go(-1) ...
- 大数据-zookeeper集群安装
一.安装前发现的问题: 1.安装前期发现jps权限不够 [root@master1 ~]# jps -bash: /opt/workspace/jdk1./bin/jps: Permission de ...
- springMvc 中返回字符串 乱码解决
/** * produces=MediaType.APPLICATION_JSON_VALUE+";charset=utf-8" 乱码解决 * @param callback * ...
- c# 水晶报表使用说明
水晶报表介绍 水晶报表是 vs 早期版本自带的一款报表控件.vs2017不自带水晶报表,需要自行安装.虽然水晶报表是收费控件,但是微软已经付过钱了,所以vs自带的水晶报表可以直接使用. 如果项目是 . ...
- java多线程-ThreadLocal
大纲: 用法 源码 一.用法 ThreadLocal是一个容器,顾名思义就是把一个变量存到线程本地. class Test { public static void main(String[] arg ...
- CentOS系统服务配置资源限制ulimit
使用Systemd管理服务的,均可使用此方法. 在 /usr/lib/systemd/system/xxx.service中,添加如下内容即可: [Service] # Other directive ...
- logback.xml文件配置(按时间、文件大小和log名称生成日志)
之前项目中日志多用的log4j2,偶然看到在importNew看到了logback,自己查了下,发现Logback和log4j是非常相似的,其作者也是同一个人,并且logback相比于log4j性能更 ...
- sql根据表中数量字段自动复制记录行
客户需要将表中统计好的数据还原成统计前的原始记录 例如: ID Name QTYCount100 Name1 1101 Name2 2102 Name3 3103 Name4 4104 Name5 5 ...
- android actionbar viewpager 实现类微信主界面布局
1 Activity public class MainActivity extends FragmentActivity { private ViewPager pager; private Act ...