HDU 1010 Tempter of the Bone (ZOJ 2110) DFS+剪枝
传送门:
HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1010
ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1110
题目大意:
一只狗陷入了迷宫,他每秒必须走一步,并且不能重复走已经走过的地方,给定一个出口,要求在恰好为T的时间到达,如果可以,输出YES否则NO
不断的TLE,然后搜了下题解。
这题最漂亮的剪枝就在于奇偶的判断上。Orz
DFS过程中,设终点的坐标为door_x,door_y。当前的坐标为x,y,目标时间为target,当前时间为step
那么如果他能敲好在target-step的时间到达,那么 target - step 和 abs(door_x - x) + abs(door_y - y) 奇偶性相同。
即 ( target - step ) % 2== ( abs(door_x - x) + abs(door_y - y) ) % 2
根据奇-奇=偶,偶-偶=偶 ,可以直接写成
remain=target- (step + abs(door_x - x) + abs(door_y - y))
remain & 1 (为1的话说明remain最后一位为1,显然奇偶性不同)
其他两个剪枝看代码吧
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
const int MAXN=10;
char maze[MAXN][MAXN];
const int dx[]={1 ,-1, 0 , 0};
const int dy[]={0 , 0 ,1 ,-1};
int start_x,start_y,door_x,door_y; bool dfs(int x,int y,int step,int target)
{
if(step>target) //剪枝1
return false; int remain=target- (step + abs(door_x - x) + abs(door_y - y));//当前和终点的距离
if(remain < 0 || remain & 1 ) //剪枝2,如果当前距离更大那么答案显然不存在
return false; //如果奇偶性不同也不行,奇-奇=偶,偶-偶=偶
//Orz想出来的人 for(int i=0;i<4;i++)
{
int nx=x + dx[i];
int ny=y + dy[i];
if(maze[nx][ny]=='.')
{
maze[nx][ny]='X';
if(dfs(nx,ny,step+1,target))
return true;
maze[nx][ny]='.';
}
else if(maze[nx][ny]=='D' && step+1==target)
return true; }
return false;
} int main()
{
int n,m,t;
while(scanf("%d%d%d",&n,&m,&t),n||m||t)
{
int empty=0;
for(int i=1;i<=n;i++)
{
scanf("%s",maze[i]+1); //一开始WA不断就是因为输入
for(int j=1;j<=m;j++)
{
if(maze[i][j]=='S')
start_x=i,start_y=j;
else if(maze[i][j]=='D')
door_x=i,door_y=j;
if(maze[i][j]=='.')
empty++;
}
} if(empty +1 < t) //剪枝3,如果可走的少于出现出口的时间,显然无解。
{
printf("NO\n");
continue;
} for(int i=0;i<=n+1;i++) //最外层直接包上X,省了等下判断越界问题。
maze[i][0]=maze[i][m+1]='X';
for(int i=0;i<=m+1;i++)
maze[0][i]=maze[n+1][i]='X'; printf("%s\n",dfs(start_x,start_y,0,t)==true? "YES":"NO");
}
}
HDU 1010 Tempter of the Bone (ZOJ 2110) DFS+剪枝的更多相关文章
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- 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 奇偶剪枝
如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...
- 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 1010 Tempter of the Bone 分类: Translation Mode 2014-08-04 16:11 82人阅读 评论(0) 收藏
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1010 Tempter of the Bone 深搜+剪枝
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 1010 Tempter of the Bone(深搜+奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
随机推荐
- Directx9.0 学习教程3 -图形学之创建点 线 三角形 等
1.首先 介绍点的表示方法 struct CUSTOMVERTEX { float x,y,z; }; CUSTOMVERTEX Vertices[] = { {-5.0, -5.0, 0.0}, { ...
- AQS -> AbstractQueuedSynchronizer
前言 : 先说说这个 CLH锁: 加锁 1. 创建一个的需要获取锁的 Node 2. 通过 CAS操作 让自己 成为这个尾部的节点,然后令 设置自己的pre 3. 自旋,直到pre节点释放 释放: 1 ...
- 更为详细的Txtsetup.sif文件解释
更为详细的Txtsetup.sif文件解释;代码页定义, 以免文本安装模式下无法正常显示简体中文 (以下基本都是跟简体中文相关的, 不同语言版本的 Windows, 此处定义也不同)[nls]Ansi ...
- 洛谷 P1313 计算系数
题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...
- Bitmap Image Graphics
Bitmap Image Graphics private void DrawImagePointF(PaintEventArgs e){ // Create image. Image new ...
- 【例7-15 UVA-1603】Square Destroyer
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先预处理出所有的正方形(长度为1,2...n的)所包含哪些边. 然后记录每个正方形的应有边长和实际边长(有些边被删掉了); 然后搜的 ...
- 洛谷——P1056 排座椅
https://www.luogu.org/problem/show?pid=1056#sub 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主 ...
- 【MySQL集群】——Java程序连接MySQL集群
上篇简介了怎样在Windows环境下建立配置MySQL集群,这里用一个实现注冊功能的小Demo通过jdbc的方式连接到MySQL集群中. 外部程序想要远程连接到mysql集群,还须要做的一个操作就是设 ...
- 如何查看kafka消费者信息?
看kafka消费者信息? 进入cd $ZOOKEEPER_HOME/bin下. ./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zoo ...
- 为什么选择Solr?
在大型的SQL数据库上很难执行高速的查询有Solr是Apache 下的一个开源项目,使用Java基于Lucene开发的全文检索服务: 它是一个独立的企业级搜索应用服务器,它对外提供类似于Web-ser ...