<pre name="code" class="cpp">#include <stdio.h> // 不知道何为 比某有人的程序慢.照他的都快改成一模一样了还是比他的慢╮(╯_╰)╭ #include <stdlib.h> int n,m,t,dx,dy,flag,tem; char mp[9][9]; int dir[4][2]={1,0,0,1,0,-1,-1,0}; void dfs(int x,int y,int last)//last 是剩余时间. { if(flag) return ; if(last==0) { if(x==dx&&y==dy) { flag=1; return; } return; } tem=abs(x-dx)+abs(y-dy)-last; if(tem>0||(tem)&1) //奇偶剪枝 + 剩余时间剪枝 return; int i,lx,ly;//下一个点 for(i=0;i<4;i++) { lx=x+dir[i][0]; ly=y+dir[i][1]; if(lx>=0&&lx<n&&ly>=0&&ly<m&&mp[lx][ly]!='X') { mp[lx][ly]='X'; dfs(lx,ly,last-1); mp[lx][ly]='.'; } } } int main() { int i,j,sum,sx,sy; while(~scanf("%d%d%d",&n,&m,&t)) { if(n==0 && m==0 && t==0) break; sum=0; for(i=0;i<n;i++) { scanf("%s",mp[i]); for(j=0;j<m;j++) { if(mp[i][j]=='X') sum++; else if(mp[i][j]=='S') sx=i,sy=j; else if(mp[i][j]=='D') dx=i,dy=j; } } if(n*m-sum <= t) //剪枝 总共的可以走的格子要多于时间 { printf("NO\n"); continue; } flag=0; mp[sx][sy]='X'; dfs(sx,sy,t); if(flag) puts("YES"); else puts("NO"); } return 0; }