您的位置:首页 > 其它

hdu 1010 走到终点时刚好花掉所有时间 (DFS + 奇偶性剪枝 )

2015-05-15 20:25 351 查看

题意:输入一个n*m的迷宫,和一个T:可以在迷宫中生存的最大时间。S为起点,D为终点。并且,每个格子只能踩一次,且只能维持一秒,然后该块地板就会塌陷。所以你必须每秒走一步,且到D点时,所用时间为T。用深搜。
奇偶性剪枝:如果当前的狗所在的坐标与D的坐标奇偶性不一样,那么狗需要走奇数步。
同理,如果狗所在坐标与D的坐标奇偶性一样,那么狗需要走偶数步数。

也就是说,狗的坐标x、y和对2取余是它的奇偶性,Dxy和对2取余是D的奇偶性。
两个奇偶性一加再对2取余,拿这个余数去与剩下时间对2取余的余数作比较即可。

Sample Input
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0

Sample Output
NO
YES

 

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
#include <queue>

using namespace std;

int m,n,t;
char map[8][8];
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
int ex,ey,sx,sy,ok;//e表示end,终点,s表示start,出发点,ok用来判断是否在规定时间到达

void dfs(int x,int y,int cnt)
{
int i;
if(cnt==t)//剪枝:到时间了符合条件ok=1再退出,不符合条件直接退出。
{
if(ex==x&&ey==y)ok=1;
return;
}
if(ok)return;//找到解后还有部分在继续搜索,这条是为了让其它搜索停止

for(i=0;i<4;i++)
{
int fx=x+dir[i][0];
int fy=y+dir[i][1];
if(fx>=0&&fx<n&&fy>=0&&fy<m&&map[fx][fy]!='X')
{
map[fx][fy]='X';
dfs(fx,fy,cnt+1);
map[fx][fy]='.'; //回溯
}
}
}
int main()
{
int i,j;
//freopen("in.txt","r",stdin);
while(scanf("%d%d%d",&n,&m,&t))
{
if (m == 0 && n == 0 & t == 0)
break ;

for(i=0;i<n;i++)
{
scanf("%s",map[i]);
for(j=0;map[i][j]!='\0';j++)
{
if(map[i][j]=='S')
{
sx=i;sy=j;
}
else if(map[i][j]=='D')
{
ex=i;ey=j;
}

}
}
if(abs(sx - ex) + abs(sy - ey) > t || (sx +sy+ex+ey+t)%2 == 1)//如果步数大于时间 或步数的奇偶性不一致
printf("NO\n");
else
{
ok=0;
map[sx][sy]='X';
dfs(sx,sy,0);
if(ok)printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: