深搜
注意剪枝。
#include<iostream>
#include<cstdio>
using namespace std;
int flag;
char map[10][10];
int X,Y,t;
int n,m;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
void dfs(int x,int y,int time)
{
if(x==X&&y==Y&&time==t)
{
flag=1;
return;
}
if(time>t)
return;
if((t-time)%2!=(abs(X-x)+abs(Y-y))%2)
return;
if(flag)
return;
int i;
for(i=0;i<4;i++)
{
int u,v;
u=dir[i][0]+x;
v=dir[i][1]+y;
if(u<n&&u>=0&&v<m&&v>=0&&map[u][v]!='X')
{
map[u][v]='X';
dfs(u,v,time+1);
map[u][v]='.';
}
}
}
int main()
{
int x,y;
while(cin>>n>>m>>t&&(n||m||t))
{
int i,j;
int k=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='.')
k++;
if(map[i][j]=='S')
{
x=i;
y=j;
map[i][j]='X';//注意
}
if(map[i][j]=='D')
{
X=i;
Y=j;
}
}
}
if(t-1>k)
{
cout<<"NO"<<endl;
continue;
}
flag=0;
dfs(x,y,0);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}