分析:迷宫问题,要求从S恰好走t步到达D,如果从S到D的最短距离大于t或者S到D的距离和t一奇一偶都不可能到达,直接输入NO,否则Dfs搜索所有可能的路如果存在满足条件的就标记flag=1。
# include <stdio.h> # include <string.h> # define abs(x) x>0?x:-(x); int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int n,m,t,f,count,visit[10][10]; char map[10][10]; void DFS(int x0,int y0) { int i,a,b; if(count>t||f==1) return; if(count==t&&map[x0][y0]=='D') {f=1;return;} for(i=0;i<4;i++) { a=x0+dx[i]; b=y0+dy[i]; if(a>=0&&a<n&&b>=0&&b<m&&map[a][b]!='X'&&!visit[a][b]) { visit[a][b]=1; count++; DFS(a,b); count--; visit[a][b]=0; } } } int main() { int i,j,x0,y0,x1,y1,d1,d2; while(scanf("%d%d%d",&n,&m,&t)!=EOF) { if(n==0&&m==0&&t==0) break; for(i=0;i<n;i++) scanf("%s",map[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) if(map[i][j]=='S') x0=i,y0=j; else if(map[i][j]=='D') x1=i,y1=j; d1=abs(x1-x0); d2=abs(y1-y0); if((d1+d2>t)||(d1+d2+t)%2==1) {printf("NO\n");continue;} memset(visit,0,sizeof(visit)); f=count=0; visit[x0][y0]=1; DFS(x0,y0); if(f==1) printf("YES\n"); else printf("NO\n"); } return 0; }