HDU 1010 Tempter of the Bone --- DFS
题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D。
参考: 奇偶剪枝
奇偶剪枝简单解释:
在一个只能往X、Y方向走的方格上,从起点到终点的最短步数为T1,并记其他任意走法所需步数为T2,则T2-T1一定为偶数。
即若某一点到终点的最短步数为T1,且T3-T1为奇数,则一定无法话费T3步恰好到达终点。
/*HDU 1010 ------ Tempter of the Bone DFS*/
#include <cstdio>
#include <cstring> int m, n, t, startx, starty, endx, endy;
char mapp[][];
bool visit[][], ans, flag; /*求a-b的绝对值*/
int abs(int a, int b){
if (a < b)
return b - a;
else
return a - b;
} /*搜索从i,j处走走到出口的结果 i j为横纵坐标 c为当前已走步数*/
void DFS(int i, int j, int c){
if (flag || c > t || i <= || i > n || j <= || j > m)
return;
if (mapp[i][j] == 'D' && c == t){
ans = flag = ;
return;
}
int tmp = abs(i, endx) + abs(j, endy); //最短可到距离
tmp = t - c - tmp; //t-c为剩余可走步数 减去最短距离为 剪纸
if (tmp & ) //若剪枝后tmp为奇数 一定不可到达
return; //左边的点可以访问
if (!visit[i - ][j] && mapp[i - ][j] != 'X'){
visit[i - ][j] = true;
DFS(i - , j, c + );
visit[i - ][j] = false;
}
//右边的点可以访问
if (!visit[i + ][j] && mapp[i + ][j] != 'X'){
visit[i + ][j] = true;
DFS(i + , j, c + );
visit[i + ][j] = false;
}
//上边的点可以访问
if (!visit[i][j - ] && mapp[i][j - ] != 'X'){
visit[i][j - ] = true;
DFS(i, j - , c + );
visit[i][j - ] = false;
}
//下边的点可以访问
if (!visit[i][j + ] && mapp[i][j + ] != 'X'){
visit[i][j + ] = true;
DFS(i, j + , c + );
visit[i][j + ] = false;
}
} int main()
{
//n行m列t步
while (scanf("%d%d%d", &n, &m, &t) == && (m + n + t)){
int k = ;
memset(visit, , sizeof visit);
//i,j取1是为了判别时数组不越界
for (int i = ; i <= n; ++i){
scanf("%s", mapp[i]+);
for (int j = ; j <= m; ++j){
if (mapp[i][j] == 'X'){
++k; //记录墙的数量
}
else if (mapp[i][j] == 'S'){
startx = i; //记录起始点
starty = j;
visit[i][j] = true;
}
else if (mapp[i][j] == 'D'){
endx = i; //记录终点
endy = j;
}
}//for(j)
}//for(i) ans = flag = ;
if (n*m - k - >= t) //总数-墙-起点 需大于等于 步数
DFS(startx, starty, );
if (ans)
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+奇偶剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意: 输入 n m t,生成 n*m 矩阵,矩阵元素由 ‘.’ 'S' 'D' 'X' 四 ...
- hdu - 1010 Tempter of the Bone (dfs+奇偶性剪枝) && hdu-1015 Safecracker(简单搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 这题就是问能不能在t时刻走到门口,不能用bfs的原因大概是可能不一定是最短路路径吧. 但是这题要过除了细心 ...
- (step4.3.1) hdu 1010(Tempter of the Bone——DFS)
题目大意:输入三个整数N,M,T.在接下来的N行.M列会有一系列的字符.其中S表示起点,D表示终点. .表示路 . X表示墙...问狗能有在T秒时到达D.如果能输出YES, 否则输出NO 解题思路:D ...
- HDU 1010 Tempter of the Bone DFS(奇偶剪枝优化)
需要剪枝否则会超时,然后就是基本的深搜了 #include<cstdio> #include<stdio.h> #include<cstdlib> #include ...
- HDU 1010 Tempter of the Bone (DFS+可行性奇偶剪枝)
<题目链接> 题目大意:一个迷宫,给定一个起点和终点,以及一些障碍物,所有的点走过一次后就不能再走(该点会下陷).现在问你,是否能从起点在时间恰好为t的时候走到终点. 解题分析:本题恰好要 ...
- HDOJ.1010 Tempter of the Bone (DFS)
Tempter of the Bone [从零开始DFS(1)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1010 Tem ...
- 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 ...
随机推荐
- java.lang.InstantiationException
java.lang.InstantiationException 出现这种异常的原因通常情况下是由于要实例化的对象是一个接口或者是抽象类等无法被实例化的类.
- 火狐和IE的window.event对象详解(转载)
FF的FIREBUG,不仅能测试JS还能检查CSS错误,是一般常用的. 但它主要检查FF方面的错误,对IE就无能为力了. 要测试IE,就用ieTester,它可以测试IE几乎所有版本(1.0恐怕也用不 ...
- 关于SharePoint REST中的授权的研究
博客地址:http://blog.csdn.net/FoxDave 当我们开发SharePoint APP需要调用REST服务时,可以使用OAuth完成授权,也可以使用跨域库.以下是微软专家的一段注解 ...
- 基础框架Fundation和UIkit框架的定义和使用
Foundation 框架为所有应用程序提供基本的系统服务 您的应用程序以及 UIKit 和其他框架,都建立在 Foundation 框架的基础结构之上.Foundation 框架提供许多基本的对象类 ...
- Design Patterns---- Strategy 模式
设计模式:可复用面向对象软件的基础 书中对 Strategy 模式的定义如下: 定义了一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于它的用户而变化. 案例:设计一个商 ...
- iOS 从相机或相册获取图片并裁剪
今天遇到一个用户头像上传的问题,需要从相册或者相机中读取图片.代码很简单,抽取关键部分,如下: //load user image - (void)UesrImageClicked { UIActio ...
- "由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的解决方案
先使用如下命令登录到服务器: mstsc /v:{服务器IP} /admin 然后再使用下列方法之一即可. 方法一: 1.单击“开始→运行”,输入“gpedit.msc”打开组策略编辑器窗口,依次定位 ...
- JS手机定位地理位置
/** * 以下为html5代码,获取地理位置 */ /** * 设置地址 */ function setAddress(json) { var position = document.getElem ...
- 如何实现Magento产品批量导入?
从事外贸的我们在工作中,经常需要添加成千上万个的产品,如果一个一个的去上传,要花费很多时间,有是很让人头痛,那么应该如何实现产品批量上传?如果使用的是Magento系统的话,那么你现在有福利了,因为M ...
- sprint计划会议
会议召开时间表 日期 时间 内容 05/09 21:00-22:00 讨论题目(未果) 05/10 21:00-21:30 确定题目(网络助手) 05/13 21:00-21:45 讨论软件页面设计 ...