您的位置:首页 > 其它

hdu1010 Tempter of the Bone

2014-07-22 11:11 260 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1010

题意:输入一个n*m的迷宫,和一个T:可以在迷宫中生存的最大时间。S为起点,D为终点。并且,每个格子只能踩一次,且只能维持一秒,然后该块地板就会塌陷。所以你必须每秒走一步,且到D点时,所用时间为T。用深搜。

之前,误以为就是找到最短路,结果不是,而是要看是否能在所有可能的路中找到刚好满足条件的路程,后来,单用深搜,超时,所以,后来的剪枝非常重要!!!(这道题还是要多看!!!!!)
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int xx[4]={0,1,0,-1};
int yy[4]={1,0,-1,0};
char map[10][10];
void init()
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
map[i][j]='X';  //X是狗不能过去的。。初始化为X是为了防止出界
}
}
int s1,s2,e1,e2,t,flag=0;
void DFS(int s1,int s2,int time)
{
if(flag==1)
return ;
if(s1==e1&&s2==e2)
{
if(time==t)
{
flag=1;
}
return ;
}
int nowx,nowy,i;
for(i=0;i<4;i++)
{
nowx=s1+xx[i];
nowy=s2+yy[i];
if(map[nowx][nowy]!='X')
{
time++;
map[nowx][nowy]='X';
DFS(nowx,nowy,time); //没有找到目标点(.)就会返回这里
map[nowx][nowy]='.';//然后重新开始
time--;             //然后就会减1
}
}
}
int main()
{
int n,m;
while(~scanf("%d %d %d",&n,&m,&t)&&n!=0&&m!=0&&t!=0)
{
init();
int i,j,time=0,count=0;
getchar();
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='D')  //能出去的门(狗最后在的地方)(剪枝)
e1=i,e2=j;
else if(map[i][j]=='S')  //狗开始在的地方
s1=i,s2=j;
else if(map[i][j]=='.')  //狗可以走的地方
count++;
}
}
if(count+1<t)  //小于规定时间,就不能存活。。
{
cout<<"NO"<<endl;
continue;
}
flag=0;
map[s1][s2]='X';
DFS(s1,s2,time);
if(flag==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;

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