题目大意是某人陷入了一个迷宫,他要逃出去,‘x’是墙走不通。‘.’是可走点。‘s’是起始点,‘d’是终点。走一步一秒,在限定时间内走完就输出“YES”
关键处就是要进行奇偶剪枝。
tmp=(t-abs(sx-ex)+abs(sy-ey))%2; 为奇数就是代表走不通。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int f[4][2]={0,1,1,0,0,-1,-1,0};
char a[10][10];
int n,m,t;
int flag,sx,sy,ex,ey;
void dfs(int x,int y,int time)
{
int fx,fy;
if(flag)
return ;
if(time == t)
{
if(ex==x&&ey==y)
{
flag=1;
return ;
}
return ;
}
int tmp;
tmp=(t-abs(sx-ex)+abs(sy-ey))%2;
if(tmp)
return ;
for(int i=0;i<4;i++)
{
fx=x+f[i][0];fy=y+f[i][1];
if(fx<=n&&fx>0&&fy>0&&fy<=m&&(a[fx][fy] == '.'||a[fx][fy] == 'D'))
{
a[fx][fy]='X';
dfs(fx,fy,time+1);
a[fx][fy]='.';
}
}
return ;
}
int main()
{
while(cin>>n>>m>>t)
{
if(n == 0&&m == 0&&t == 0)
break;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j] == 'S')
{
sx=i;sy=j;
}
if(a[i][j] == 'D')
{
ex=i;ey=j;
}
}
flag=0;
dfs(sx,sy,0);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}