HDU 1010Tempter of the Bone(奇偶剪枝回溯dfs)
Tempter of the Bone
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 55541 Accepted Submission(s): 14983
The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.
'X': a block of wall, which the doggie cannot enter;
'S': the start point of the doggie;
'D': the Door; or
'.': an empty block.
The input is terminated with three 0's. This test case is not to be processed.
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0
YES
题目大意:
要求每个点只能走一次,从起点走到终点刚好sum步,点表示可以走得路经。S,D分别代表起点终点。
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
char a[10][10];
int visi[10][10];
int n,m,sum,flag;
struct node
{
int x;
int y;
};
node sta,en; //起点与终点
int dir[4][2]= //四个方向
{
{-1,0},{1,0},{0,-1},{0,1}
}; void dfs(int cx,int cy,int step)
{
int i;
if(flag==1) return; //找到解
if(step==sum)
{
if(cx==en.x&&cy==en.y)
flag=1;
return;
}
int need=abs(cx-en.x)+abs(cy-en.y);
int tmp=sum-step;
if((tmp%2==0&&need%2==1)||(need%2==0&&tmp%2==1)||tmp<need) //奇偶剪枝
return;
for(i=0;i<4;i++)
{
int px,py;
px=cx+dir[i][0],py=cy+dir[i][1];
if(px>=0&&px<n&&py>=0&&py<m&&(a[px][py]=='.'||a[px][py]=='D')&&!visi[px][py])
{
visi[px][py]=1;
dfs(px,py,step+1);
visi[px][py]=0; //回溯
}
}
//return;
} int main()
{
int i,j;
while(scanf("%d%d%d",&n,&m,&sum))
{
if(n==0&&m==0&&sum==0)
break;
for(i=0;i<n;i++)
scanf("%s",a[i]);
flag=0;
for(i=0;i<n;i++) //找起点
{
for(j=0;j<m;j++)
{
if(a[i][j]=='S')
{
sta.x=i; sta.y=j;
flag=1; break;
}
}
if(flag) break;
}
flag=0;
for(i=0;i<n;i++) //找终点
{
for(j=0;j<m;j++)
{
if(a[i][j]=='D')
{
en.x=i; en.y=j;
flag=1; break;
}
}
if(flag) break;
} flag=0;
memset(visi,0,sizeof(visi));
visi[sta.x][sta.y]=1;
dfs(sta.x,sta.y,0);
if(flag) puts("YES");
else puts("NO");
}
return 0;
} //703MS 228K
HDU 1010Tempter 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 奇偶剪枝
如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...
- zoj 2110 很好的dfs+奇偶剪枝
//我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> ...
- 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(深搜+奇偶剪枝)
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+奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu Tempter of the Bone (奇偶剪枝)
学习链接:http://www.ihypo.net/1554.html https://www.slyar.com/blog/depth-first-search-even-odd-pruning.h ...
随机推荐
- OpenStack ceilometer部署安装监控,计费数据抓取测试Ok
- 如何不让oracle使用linux的swap分区
经常看到swap分区被使用,被缓存的内容本来是为了增加命中率,结果去不断换入换出,导致本地磁盘IO增加,影响访问速度.所以在内存充足的情况下,如果我们觉得不需要使用swap分区的时候,那就要想办法尽量 ...
- iOS 创建推送证书
1.首先你想创建推送证书和以前你做真机测试证书一样,需要实现准备一个99$的付费账号.然后登陆苹果开发者网站.http://developer.apple.com/ 2.登陆以后你能看到这个界面然后选 ...
- C#基础:委托 【转】
委托是C#中最为常见的内容.与类.枚举.结构.接口一样,委托也是一种类型.类是对象的抽象,而委托则可以看成是函数的抽象.一个委托代表了具有相同参数列表和返回值的所有函数.比如: delegate in ...
- JAVA学习第二十九课(经常使用对象API)- String类
多线程告一段落,開始经常使用对象API的涉及,背也要背下来!.! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不能够被改变 一.特点 publ ...
- OS Kernel Parameter.semopm
安装Oracle11g内核参数semopm未校验通过,点击Fix&Check Again后,会提示执行修改脚本,在/tmp/CVU_11.2.0.1.0_oracle下,找到并执行该脚本run ...
- Fault Diagnosability Infrastructure Overview
Fault Diagnosability Infrastructure Overview The fault diagnosability infrastructure aids in prevent ...
- Gson解析JsonObject和JsonArray
Gson中重要的几个核心类: Gson.JsonParser.JsonObject.JsonArray. 下面就是解析的步骤: public void parserJsonArray(String s ...
- Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理
所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...
- Springmvc加载静态文件和开启EL表达式的支持
一.静态文件加载问题 刚开始学习SpringMVC,发现静态文件无法加载 web.xml配置如下: <web-app id="WebApp_ID" version=" ...