方法:dfs
思想:由于本题中规定只有在固定时刻到达目的点才能逃脱,
不能提早,更不能延迟,故不能用bfs。可以用dfs找出所有情况,
若有可行解,直接返回即可。本题比较郁闷的是,在tzc上将方向
数组int dir[4][2]稍微变动两下,就会超时。这也是今后出现TLE时
该考虑的重要的一点吧,可以作为经验教训。
#include<stdio.h> #include<math.h> char map[11][11]; int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; int t; int flag; int n,m; int dx,dy; void dfs(int i,int j,int step) { int x,y; if(i==dx&&j==dy&&step==t) flag=1; if(step>t) return; if(flag) return; if((t-step)%2!=(abs(dx-i)+abs(dy-j))%2)//如果奇偶性不同就返回 return; for(int u=0;u<4;u++) { x=i+dir[u][0]; y=j+dir[u][1]; if(x>=0&&y>=0&&x<n&&y<m) { if(map[x][y]!='X') { map[x][y]='X'; dfs(x,y,step+1); map[x][y]='.'; } } } } int main() { int i,j,x,y,k; while(scanf("%d%d%d",&n,&m,&t)!=-1) { k=0; if(n==0&&m==0&&t==0) break; getchar(); for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='S') { x=i; y=j; map[i][j]='X'; } if(map[i][j]=='D') { dx=i; dy=j;k++; } if(map[i][j]=='.') k++; } getchar(); } if(k<t) { printf("NO ");continue; } flag=0; dfs(x,y,0); if(flag) printf("YES "); else printf("NO "); } return 0; } /* 4 4 5 S.X. ..X. ..XD .... 3 4 5 S.X. ..X. ...D 0 0 0 */