#include <stdio.h> #include <math.h> #define N 10 char a[N][N]; bool vis[N][N]; int time; int doi,doj;//目标位置 int mo[4][2]={0,-1,0,1,1,0,-1,0}; bool dfs(int i,int j,int ctime) { int k; int in,jn;//next if (ctime==time && a[i][j]=='D')//终点 { return 1; } if (ctime>=time)//剪枝1: current time 大于time { return 0; } if (time-ctime<(abs(i-doi)+abs(j-doj)))//剪枝2: 剩余时间小于理论上最小时间 { return 0; } for (k=0;k<4;k++) { in=i+mo[k][0]; jn=j+mo[k][1]; if (a[in][jn]!='X' && vis[in][jn]==0) { vis[in][jn]=1; if (dfs(in,jn,ctime+1)) { return 1; } else { vis[in][jn]=0; } } } return 0; } int main () { //freopen("1.txt","r",stdin); int n,m,i,j; int sti,stj;//起始位置 while(scanf("%d%d%d",&n,&m,&time),n||m||time) { getchar(); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { scanf("%c",&a[i][j]); if (a[i][j]=='S') { sti=i; stj=j; } else if (a[i][j]=='D') { doi=i; doj=j; } vis[i][j]=0; } getchar(); } for(i=0;i<=n+1;i++)//外墙初始化 { a[i][0]=a[i][m+1]='X'; } for(j=0;j<=m+1;j++)//外墙初始化 { a[0][j]=a[n+1][j]='X'; } vis[sti][stj]=1; //奇偶性判断 理论上最短时间和实际所用时间奇偶性一样 if ( (time-abs(sti-doi)-abs(stj-doj))%2==0 && dfs(sti,stj,0)) printf("YES/n"); else printf("NO/n"); } } 速度太慢了,还得再做过