/*题意:这个题目的意思是给定你起点S,和终点D,问你是否能在 T 时刻恰好到达终点D。(刚开始没仔细看题,以为在T秒之内到达就行)
分析:这样一看很明显是DFS,不过里面涉及到很多剪枝。*/
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX 8
char map[MAX][MAX];
int m,n,a,b;
bool visited[MAX][MAX];
int t,sum,flag,bigcount;
void dfs(int x,int y,int sum)
{
if(flag)
return ;
if(x>=n||x<0||y<0||y>=m||map[x][y]=='X'||visited[x][y]==true)
return ;
if(map[x][y]=='D')
{
if(sum==t)
flag=1;
return ;
}
if(sum>=t)
return ;
visited[x][y]=true;
dfs(x+1,y,sum+1);
dfs(x-1,y,sum+1);
dfs(x,y+1,sum+1);
dfs(x,y-1,sum+1);
visited[x][y]=false;
}
int main()
{
while(cin>>n>>m>>t)
{
int x,y,a,b;
memset(visited,false,sizeof(visited));
if(m==0&&n==0&&t==0)
continue;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{
x=i;
y=j;
}
if(map[i][j]=='D')
{
a=i;
b=j;
}
}
if(abs(x-a)+abs(y-b)>t||(a+b+x+y+t)%2==1)//奇偶剪枝,很关键
{
cout<<"NO"<<endl;
continue;
}
flag=0;
dfs(x,y,0);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
hdu1010(Tempter of the Bone)深搜+剪枝
最新推荐文章于 2021-01-23 20:39:49 发布