http://acm.hdu.edu.cn/showproblem.php?pid=1010
AC代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
char map[10][10];
int vis[10][10];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int N,M,T;
int flag;
int x2,y2;
int judge(int x,int y){
if (x<0||x>=N||y<0||y>=M||map[x][y]=='X')
return 0;
return 1;
}
void dfs(int i,int j,int step){
if(map[i][j]=='D'){
if (step==T){
flag=1;
}
return ;
}
if (flag)
return ;
int temp=T-step-abs(i-x2)-abs(j-y2);// 奇偶剪枝
if (temp<0||temp%2)
return ;
for (int k=0;k<4;k++){
int x=i+dir[k][0];
int y=j+dir[k][1];
if(judge(x,y)&&!vis[x][y]){
vis[x][y]=1;
dfs(x,y,step+1);
vis[x][y]=0;
}
}
}
int main (){
while (scanf ("%d%d%d",&N,&M,&T)&&(N||M||T)){
getchar();
for (int i=0;i<N;i++){
scanf ("%s",map[i]);
}
int x,y;
int w=0;
for (int i=0;i<N;i++){
for (int j=0;j<M;j++){
if (map[i][j]=='S'){
x=i;
y=j;
}
if(map[i][j]=='D'){
x2=i;
y2=j;
}
}
}
memset(vis,0,sizeof(vis));
flag=0;
vis[x][y]=1;
if (N*M-w>=T)
dfs(x,y,0);
if (flag)
printf ("YES\n");
else
printf ("NO\n");
}
return 0;
}