HDU1010 Tempter of the Bone
解题思路:相当经典的一题,回溯,具体细节处理见代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = ;
int vis[maxn][maxn], dir[][] = {, , -, , , , , -};
char mapp[maxn][maxn];
int n, m, t, flag, cnt, si, sj, di, dj; void DFS(int x, int y, int cnt)
{
if(x == di && y == dj) //如果走到终点
{
if(cnt == t) flag = ; //并且步数恰好等于时间,门正好打开。
return ; //不过是否走出去,都必须返回
}
if(cnt >= t) return ; //超过时间再继续走已经没有意义了。
if(mapp[x][y] == 'X') return ; //X的地方是不能走的。
vis[x][y] = ; //标记为已经走过
for(int i = ; i < ; i++) //四个方向搜索
{
int xx = x + dir[i][];
int yy = y + dir[i][]; //初始化时边界之外的地方都标记为X,所以此处包括边界的判断。
if(mapp[xx][yy] == 'X' || vis[xx][yy]) continue;
vis[xx][yy] = ; //标记为已走过
DFS(xx, yy, cnt + ); //搜索
vis[xx][yy] = ; //回溯
if(flag) return ; //这步至关重要,否则会TLE
}
return ;
} int main()
{
while(~scanf("%d %d %d", &n, &m, &t) && (n || m || t))
{
memset(vis, , sizeof(vis)); //全部标记为没有走过
memset(mapp, 'X', sizeof(mapp)); //边界之外也标记为X
for(int i = ; i <= n; i++)
{
for(int j = ; j <= m; j++)
{
scanf(" %c", &mapp[i][j]);
if(mapp[i][j] == 'S') si = i, sj = j;
if(mapp[i][j] == 'D') di = i, dj = j;
}
} //非常经典的剪枝,否者会TLE
//如果走到该点所用的最少步数都超过t,是不可能走到的。
//后面一个条件是奇偶判断的问题,需要好好思考
if(abs(si-di) + abs(sj-dj) > t || (si+sj+di+dj+t) % == )
{
printf("NO\n");
continue;
} flag = , cnt = ;
DFS(si, sj, );
if(flag) printf("YES\n"); //如果flag==1,则表明走出来了。
else printf("NO\n");
}
return ;
}
HDU1010 Tempter of the Bone的更多相关文章
- 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 ...
- Hdu1010 Tempter of the Bone(DFS+剪枝) 2016-05-06 09:12 432人阅读 评论(0) 收藏
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- HDU1010:Tempter of the Bone(dfs+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 //题目链接 http://ycool.com/post/ymsvd2s//一个很好理解剪枝思想的博客 ...
- hdu1010 Tempter of the Bone(深搜+剪枝问题)
Tempter of the Bone Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission( ...
- HDU1010 Tempter of the Bone【小狗是否能逃生----DFS奇偶剪枝(t时刻恰好到达)】
Tempter of the Bone Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- HDU1010 Tempter of the Bone(回溯 + 剪枝)
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398734 题意: 输入一个 N * M的迷宫,这个迷宫里'S'代表小狗的位置,'X'代表陷阱,‘D ...
- HDU1010 --- Tempter of the Bone(dfs+剪枝)
小明做了一个很久很久的梦,醒来后他竟发现自己和朋友在一个摇摇欲坠的大棋盘上,他们必须得想尽一切办法逃离这里.经过长时间的打探,小明发现,自己所在的棋盘格子上有个机关,上面写着“你只有一次机会,出发后t ...
- ZOJ 2110 Tempter of the Bone(条件迷宫DFS,HDU1010)
题意 一仅仅狗要逃离迷宫 能够往上下左右4个方向走 每走一步耗时1s 每一个格子仅仅能走一次且迷宫的门仅仅在t时刻打开一次 问狗是否有可能逃离这个迷宫 直接DFS 直道找到满足条件的路径 ...
- ZOJ2110 HDU1010 搜索 Tempter of the Bone
传送门:Tempter of the Bone 大意是给一个矩阵,叫你是否可以在给定的可走路径上不重复地走,在最后一秒走到终点. 我用了两个剪枝,且称其为简直001和剪枝002,事实证明001不要都可 ...
随机推荐
- c#百分比
<div class="inner" style="width:@string.Format("{0:P1}", item.Maturitys) ...
- 重载和覆盖的区别?(overload vs override)
override与overload的区别? override 表示重写,overload 表示重载.override是子类和父类之间的关系,是垂直关系:overload是同一个类中方法之间的关系,是水 ...
- hdu 4352 XHXJ's LIS 数位DP
数位DP!dp[i][j][k]:第i位数,状态为j,长度为k 代码如下: #include<iostream> #include<stdio.h> #include<a ...
- hdu 4618(最大回文子矩阵)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4618 昨天多校的一道题,说多了都是泪啊,为了一道图论题,磨了那么久,结果是别的题都没看,没办法,补呗. ...
- Spring MVC 教程,快速入门,深入分析(转)
原文地址:http://elf8848.iteye.com/blog/875830/
- lintcode:交换链表当中两个节点
题目 给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点.保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做. 注意事项 你需要交换两个节点而不是改变节点的权值 ...
- java多线程浅谈
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 分这几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能. 2 ...
- 私有虚函数的特点(C++和Java的机制还有所不同)
多态性与将实现多态的函数的访问限定符没有任何关系,private 函数仍然可以实现多态,它的指针仍然位于vtbl中,只不过该函数的多态一般只能在基类的内部由其他非虚函数调用该函数的时候反映出来,访问限 ...
- #-webkit-autofill##google#启用表单自动填充时,如何覆盖黄色背景
google和opera浏览器的表单自动填充后,输入框均会变成黄色背景,黑色字体.如下图. 这样的话会与网页的整体设计风格不一致,怎样自定义样式,来覆盖黄色背景. 首先来看看是什么导致的,右键查看元素 ...
- Android setStartOffset方法:设置启动时间
[功能说明]该方法用于设置一个动画执行的启动时间,单位为毫秒.系统默认当执行start方法后立刻执行动画,当使用该方法设置后,将延迟一定的时间再启动动画. [基本语法]public void setS ...