蒟蒻决定练搜索了,所以这个dfs先练手把。。。。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
bool vis[20][20],ansflag;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int m,n,T;
char st[10][10];
int ex,ey,sx,sy;
bool check(int x,int y)
{
if(x>0&&x<=n&&y>0&&y<=m)
return true;
return false;
}
void dfs(int x,int y,int step)
{
if(ansflag)
{
return ;
}
int temp=T-step-abs(x-ex)-abs(y-ey);
if(temp<0||temp&1) return;
if(step==T)
{
if(x==ex&&y==ey)
{
ansflag=true;
}
return ;
}
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(!check(xx,yy)) continue;
if(st[xx][yy]=='X'||vis[xx][yy]) continue;
int ss=step+1;
vis[xx][yy]=1;
dfs(xx,yy,ss);
vis[xx][yy]=0;
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&T))
{
ansflag=false;
if(n+m+T==0)
break;
for(int i=1;i<=n;i++)
{
scanf("%s",st[i]+1);
for(int j=1;j<=m;j++)
{
if(st[i][j]=='S')
{
sx=i;sy=j;
}
if(st[i][j]=='D')
{
ex=i;ey=j;
}
}
}
memset(vis,0,sizeof(vis));
vis[sx][sy]=true;
dfs(sx,sy,0);
if(ansflag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}