原文:http://blog.acmj1991.com/?p=693
题意:给你一个迷宫,有得地方能走有的不能走。问在t秒时能不能到达出口
思路:深搜 外加一个剪枝点到终点的距离与规定时间之差为偶数才能到达#include<stdio.h>
#include<string.h>
int abs(int x){return x>0?x:(-x);}
#define maxN 40
char map[maxN][maxN];
int f[maxN][maxN];
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int n,m,t,x1,y1;
int dfs(int x,int y,int te)
{
if(te>=t)return false;
f[x][y]=1;
if((abs(x-x1)+abs(y-y1)+t-te)%2!=0)return false;
for(int i=0;i<4;i++)
{
int xx=dir[i][0]+x,yy=dir[i][1]+y;
if(xx<0||xx>=n||yy<0||yy>=m)continue;
if(te==t-1&&map[xx][yy]=='D')return true;
if(map[xx][yy]!='.'||f[xx][yy])continue;
f[xx][yy]=1;
if(dfs(xx,yy,te+1))return true;
f[xx][yy]=0;
}
return false;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)&&(n||m||t))
{
int x,y;
memset(f,0,sizeof(f));
memset(map,0,sizeof(map));
for(int i=0;i<n;i++){
scanf("%s",map[i]);
for(int j=0;j<strlen(map[i]);j++)
if(map[i][j]=='S')
x=i,y=j;
else if(map[i][j]=='D')
{x1=i;y1=j;}
}
if(dfs(x,y,0))
printf("YES\n");
else
printf("NO\n");
}
}