一道简单深搜题,重点是如何剪枝,不然会T到怀疑人生........
题目大意就是问能否恰好在规定的步数一刹那到达规定的地点,由此而进行思考,如果当前位置
到终点位置,在最理想无障碍地直接到所需要的步数num如果都小于剩余规定能走的步数,那岂
不适肯定不能到了。反之,则想假如已经在目的地旁边了,但是规定能走的步数还有3步,那我
只要绕一下,在理想无障碍的条件下不就能到了....因此由此就是对奇偶的判断了:当前位置坐标
到终点的最短步数一定与题目规定剩余能走的步数,同奇同偶!!!
AC代码(写的时候思维有点混乱,代码略丑):
#include<cstdio> #include<cstring> #include<cmath> using namespace std; int m,n,step,temp,FF,num,ans,ex,ey,sx,sy; char map[10][10]; int vis[10][10],dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; void dfs(int x,int y,int t) { /*if(step==t&&!vis[x][y]&&map[x][y]=='D') FF=1; if(FF) return ;*/ if(FF==1) return ; if(step==t&&x==ex&&y==ey) {FF=1;return;} int num=abs(x-ex)+abs(y-ey); if(num>step-t||(num+step-t)%2!=0) return ; for(int i=0;i<4;i++) { int nx=x+dir[i][0],ny=y+dir[i][1]; if(map[nx][ny]!='X'&&!vis[nx][ny]&&nx>=0&&nx<m&&ny>=0&&ny<n) { vis[nx][ny]=1; dfs(nx,ny,t+1); vis[nx][ny]=0; //vital } } } int main() { while(scanf("%d%d%d",&m,&n,&step),m+n+step!=0) { FF=0,ans=0; memset(vis,0,sizeof(vis)); for(int i=0;i<m;i++) { scanf("%s",map[i]); for(int j=0;j<n;j++) { if(map[i][j]=='S') sx=i,sy=j; if(map[i][j]=='D') ex=i,ey=j; if(map[i][j]=='X') ans++; } } if(n*m-ans-1<step) {puts("NO");continue;} vis[sx][sy]=1; dfs(sx,sy,0); if(FF) puts("YES"); else puts("NO"); } return 0; }