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 ...
随机推荐
- HDU 5451 广义斐波那契数列
这道题目可以先转化: 令f(1) = 5+2√6 f(2) = f(1)*(5+2√6) ... f(n) = f(n-1)*(5+2√6) f(n) = f(n-1)*(10-(5-2√6)) = ...
- 蓝桥杯 BASIC_17 矩阵乘法 (矩阵快速幂)
问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N.M(1<=N<=30, 0& ...
- android textview 跑马灯
<TextView android:layout_width="match_parent" android:layout_height="48dp" an ...
- ajax 请求超过了5s 还没有返回 的话 就自动取消
ajax请求时有个参数可以借鉴一下 var ajaxTimeOut = $.ajax({ url:'', //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : ' ...
- linux下解决端口被占用的问题
以端口9877为例,先查看是否有进程占用该端口 netstat -tln | grep 9877 然后查看占用该端口的进程的进程id lsof -i :9877 最后kill 命令结束该进程: kil ...
- 桟的min实现:O(1)时间复杂度
实现桟的push和pop操作,以及桟的min操作返回桟中的最小值,要求这三个操作的时间复杂度均为O(1). 在Java中可以使用LinkedList实现桟的各种操作,这里使用双向链表实现桟的push和 ...
- hdu - 2083 - 简易版之最短距离
找到中位数 , 根据对称性 , 当中位数需要两个数取中值的时候不需要取 , 只需要其中的任意一个数几个 例如四个数 1 , 2 , 3 , 4 . 这四个数 , 其中的 2 和 3 都可以 . 然后求 ...
- vijos 1907 飞扬的小鸟
我心里毫无波动甚至还有点想笑. WTF WTF WTF WTF WTF WTF WTF GTMD调了一天什么鬼啊. 原来更新的范围有讲究啊. #include<iostream> #inc ...
- POJ 3278 经典BFS
进一步了解了bfs; 题意:给你n,然后用+,-,*三种运算使n变成k; 漏洞:在算出新的数字之后,一定要判边界,否则RE,而且在每一步后面都得加判断是否等于K,如果是即刻退出,否则WA,判这个的时候 ...
- c++回调函数 callback
C++中实现回调机制的几种方式 (1)Callback方式Callback的本质是设置一个函数指针进去,然后在需要需要触发某个事件时调用该方法, 比如Windows的窗口消息处理函数就是这种类型.比如 ...