hdu 1010
題意 主角在規定時間內從起點到達終點,必須是是在規定的那一時刻(被坑le,
本意 想dfs暴搜一下,T的很慘,最後大佬告訴我要剪枝。明天8月1日建軍節,故寫此篇。
#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
int n,m,vis[10][10],cun[4][2]={{0,1},{0,-1},{1,0},{-1,0}},x2,y2,k,flag;
char map[10][10];
void dfs(int x,int y,int step)
{ if((abs(x-x2)+abs(y-y2))%2!=(k-step)%2)
return;
if(x==x2&&y==y2)
{
if(step==k)
{
flag=1;
return ;
}
else
return ;
}
for(int i=0;i<4;i++)
{
int xx=x+cun[i][0];
int yy=y+cun[i][1];
if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]||map[xx][yy]=='X')
continue;
vis[xx][yy]=1;
dfs(xx,yy,step+1);
vis[xx][yy]=0;
}
return ;
}
int main(){
while(cin>>n>>m>>k)
{ if(n==0&&m==0&&k==0)
break;
int x1,y1;
flag=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{ vis[i][j]=1;
x1=i;
y1=j;
}
if(map[i][j]=='D')
{
x2=i;
y2=j;
}
}
dfs(x1,y1,0);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}