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 ...
随机推荐
- BPM与OA,选择好烦恼!
企业在信息化建设的过程中 难免遭遇BPM和OA之争, 难!难!难! 选择BPM吧, 有人觉得你“打肿脸充胖子”: 选择OA嘛, “行业大哥”们已经在BPM的路上越走越远… 其实, OA和BPM从某种意 ...
- 自定义cursor
cursor: url('绝对路径/big.cur'),auto; //通用方式
- jquery判断点击事件是否为指定区域
<script type="text/javascript"> $(document).click(function(e){ e = window.event || e ...
- awt可视化界面上传数据到mysql,jsp通过jdbc方式查询数据库,并将结果打印在网页上
今天尝试写一个小demo实现下之前看过的代码,目的了解不同文件的数据访问,掌握如何获取前台数据,如何将数据库的数据在前端页面展示. awt可视化界面可已实现提交数据到数据库,也可查询数据在控制台打印. ...
- Andoid activity 生命周期
今天介绍一下Android中最常用的组件activity的生命周期.当activity处于Android应用中运行时,它的活动状态由Android以Activity栈的形式管理.当前活动的Activi ...
- ios 8+ (xcode 6.0 +)应用程序Ad Hoc 发布前多设备测试流程详解
我们开发的程序在经过simulator以及自己的iOS设备测试后,也基本完成应用程序了,这时候我们就可以把它发布出去了更更多的人去测试,我们可以在iOS平台使用ad hoc实现. 你在苹果购买的开发者 ...
- julia与python中的列表解析.jl
julia与python中的列表解析.jl #=julia与python中的列表解析.jl 2016年3月16日 07:30:47 codegay julia是一门很年轻的科学计算语言 julia文档 ...
- sql 如何把查询得到的结果如何放入一个新表中
如何把这个查询到的结果放到一张新表中? 2014-03-13 15:26 提问者采纳 表已经存在:insert into 表名 (列名1... 列名n) select 列名1....列名n f ...
- Interview----最长连续乘积字串
题目描述: 给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8. 也就是说,上述数组中,3 0.5 8这3个数的乘积3*0 ...
- 【LeetCode OJ】Palindrome Partitioning
Problem Link: http://oj.leetcode.com/problems/palindrome-partitioning/ We solve this problem using D ...