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 ...
随机推荐
- hibernate连接时指定编码方式 hibernate中文乱码问题
<property name="connection.url">jdbc:mysql://localhost:3306/cms?useUnicode=true& ...
- poj 1940 Wine Trading in Gergovia_贪心
在一条街上有许多房屋,每间屋子里都住着人,并且都是做葡萄酒生意的商人,他们每天都要决定买卖多少瓶葡萄酒.有趣的地方是,供需总是完美地一致.商人总是能买到自己需要的葡萄酒,并且,他们从来不介意是从哪个商 ...
- python 魔法方法之:__getitem__ __setitem__ __delitem__
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- BS常用方法备忘
在B/S项目开发过程中总结的一些常用方法,如:常量.验证方法.服务器控件方法.html控件方法等. ///******************* 说明 ************************ ...
- Struts2 实现文件上传
单个文件上传 关于如何创建Struts2项目:Struts2 初体验. 一.创建jsp页面: 注意!要上传文件,表单必须添加 enctype 属性,如下: enctype="multipa ...
- WindowsForm界面 运行顺序 Form属性
WindowsForm界面 运行顺序 Form属性 什么是类:1 类是面向对象编程的基本单元.类包含了两个成员 字段(Field)和方法方法(Method) 2 字段即变量 方法即函数什么是字段:字段 ...
- HTML4如何让一个DIV居中对齐?float输入日志标题
float:left,right clear:both 如何让一个DIV居中对齐? 第一步:设置外层的DIV的text-align:center; 第二步:设置里层的DIV的margin:auto 以 ...
- [MFC]解决回车键 ESC 默认关闭窗口的一般方法
在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上, ...
- sffs
因为微软收购了Skype,就减少了对linux版软件的支持,官方下载页面已找不到了.只有这一个地址了.要下的尽早.http://download.skype.com/linux/skype-ubunt ...
- 一.oracle的SQL中group by使用的情况(与聚合函数的关系)
SELECT r.industry_1,r.industry_2,r.agent_id,r.agent_name,COUNT(DISTINCT r.customer_name_a)数据总量,COUNT ...