HDOJ-1010 Tempter of the Bone(dfs+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010
给出一个n*m的迷宫 X为墙 .为空地 S为起点 D为终点 给出时间T
每走一步花费一单位的时间 走过的空地会消失不能再次经过
问能不能刚好花费T单位时间到达终点(在T时间前到达终点也算失败)
典型深搜 为减少时间花费加点剪枝
1.奇偶剪枝:给出一个01矩阵如下
从0到0或从1到1 必然要经过偶数步 从0到1或从1到0 必然要经过奇数步 所以可以通过比较起点终点的属性 判明是否已经是不可能到达的
2.如果总的地板数 小于(T - 1)个 也不可能到达
# include <stdio.h>
# define MAX 10
# define X x+dir[i][0]
# define Y y+dir[i][1] int n, m, time, sx, sy, ex, ey, dir[4][2] = {{0,-1},{1,0},{0,1},{-1,0}};
char pic[MAX][MAX];
int sign[MAX][MAX];//奇偶矩阵 bool is_ok()//奇偶剪枝
{
if(time % 2 == 0)
{
if(sign[sx][sy] == sign[ex][ey]) return true;
else return false;
}
else
{
if(sign[sx][sy] != sign[ex][ey]) return true;
else return false;
}
} bool in_map(int a, int b)//判断边界
{
return a >= 0 && a < n && b >= 0 && b < m;
} bool dfs(int x, int y, int step)
{
if(x == ex && y == ey)//到达出门 若门刚好打开 返回成功
{
if(step == time) return true;
else return false;
} for(int i = 0; i < 4; i++)//四向拓展
{
if(in_map(X, Y) && pic[X][Y] != 'X')
{
pic[X][Y] = 'X';
if(dfs(X, Y, step + 1)) return true;//若返回的是成功 则说明已找到路 退出
pic[X][Y] = '.';
}
}
return false;
} int main()
{
for(int i = 0; i < MAX; i++)//初始化奇偶矩阵
{
sign[i][0] = i % 2;
for(int j = 1; j < MAX; j++)
sign[i][j] = (sign[i][j - 1] + 1) % 2;
} while(scanf("%d %d %d", &n, &m, &time) && (n || m || time))
{
int groud = 0;//空地计数器
for(int i = 0; i < n; i++)
{
scanf("%s",pic[i]);
for(int j = 0; j < m; j++)
{
if(pic[i][j] == 'S')//起点
sx = i, sy = j, pic[i][j] = 'X';
else if(pic[i][j] == 'D')//终点
ex = i, ey = j, pic[i][j] = '.';
else if(pic[i][j] == '.')
groud++;
}
} if(is_ok() && groud + 1 >= time && dfs(sx, sy, 0)) printf("YES\n");
else printf("NO\n");
} return 0;
}
/*
/*
测试数据:
1 5 4
S...D
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
2 2 1
S.
.D
8 8 7
.DXS...X
........
XX..XX..
.X.X.X.X
..X.....
X....X..
........
XXXX....
5 4 18
S...
....
....
....
...D
6 6 10
S.....
......
......
......
......
.....D
2 3 2
SDX
..X
2 2 3
SD
..
2 2 2
SD
XX
4 4 6
.S..
XXX.
XXX.
XXXD
5 4 8
S...
.XX.
.X..
.X.X
....
3 3 3333
.S.
...
...
2 2 1
SD
..
1 5 4
S...D
4 5 5
.S...
..X..
.XDX.
..X..
2 4 7
SD..
....
2 2 3
S.
D.
4 4 9
S..X
X.X.
..XD
.... 输出:
YES
NO
YES
NO
NO
NO
YES
NO
YES
NO
NO
NO
NO
YES
YES
NO
YES
YES
YES
*/
HDOJ-1010 Tempter of the Bone(dfs+剪枝)的更多相关文章
- 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
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- hdoj 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 ...
- HDU1010:Tempter of the Bone(dfs+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 //题目链接 http://ycool.com/post/ymsvd2s//一个很好理解剪枝思想的博客 ...
- hdu 1010 Tempter of the Bone 奇偶剪枝
如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...
- (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+奇偶剪枝)
题目链接: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的原因大概是可能不一定是最短路路径吧. 但是这题要过除了细心 ...
- HDU 1010 Tempter of the Bone DFS(奇偶剪枝优化)
需要剪枝否则会超时,然后就是基本的深搜了 #include<cstdio> #include<stdio.h> #include<cstdlib> #include ...
随机推荐
- NOI2012 Day1
NOI2012 Day1 随机数生成器 题目描述:给出数列\(X_{n+1}=(aX_n+c)mod m\),求\(X_n mod g\) solution: 矩阵乘法,但数有可能在运算时爆\(lon ...
- HDU3336——KMP算法
题意是问所有前缀出现的次数和,mod10007: 想一想next数组代表什么意思,是从当前失配位置走到上一个匹配位置的后面,next[i]的值说明以当前位置为结尾,长度为next[i]的后缀,与以开头 ...
- Raw qcow qcow2 vhd-vpc虚拟磁盘格式间相互转换
- 01_docker学习总结
01 docker学习总结 toolbox https://hub.docker.com/ https://docs.docker.com/engine/installation/mac/#from- ...
- 【转】Android中自动连接到指定SSID的Wi-Fi
最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...
- [bzoj1003][ZJOI2006][物流运输] (最短路+dp)
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- 修改UISearchBar placeholder textColor
[[UILabel appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor redColor]];
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...
- (转)浅谈ASP.NET报表控件
项目中有报表图形化的需求, 于是开始在网上找第三方chart控件.因时间紧迫,大至确定了几个候选:一.Office带的OWC控件:二.ComponentOne:三.Web Chart.本文将讲解ASP ...
- javascript操作json总结
原文:http://www.cnblogs.com/worfdream/articles/1956449.html JSON(JavaScript Object Notation) 是一种轻量级的数据 ...