题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2110
题意:
一只小狗在一个古老的迷宫里找到一根骨头,当它叼起骨头时,迷宫开始颤抖,它感觉到地 面开始下沉。它才明白骨头是一个陷阱,它拼命地试着逃出迷宫。
迷宫是一个 N×M大小的长方形,迷宫有一个门。刚开始门是关着的,并且这个门会在第 T秒 钟开启,门只会开启很短的时间(少于一秒),因此小狗必须恰好在第 T秒达到门的位置。每秒钟, 它可以向上、下、左或右移动一步到相邻的方格中。但一旦它移动到相邻的方格,这个方格开始 下沉,而且会在下一秒消失。所以,它不能在一个方格中停留超过一秒,也不能回到经过的方格。
题解:
这里的时间相当于递归深度。DFS。
代码:
<span style="font-size:14px;">#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int MAX=10; char g[MAX][MAX]; int n,m,t; int sx,sy,ex,ey; int dirx[4]={0,1,0,-1}; int diry[4]={1,0,-1,0}; int escape; bool judgein(int x,int y) { return x>=0&&x<n&&y>=0&&y<m; } void dfs(int x,int y,int step) { if(step==t&&x==ex&&y==ey) { escape=1; return ; } int tmp=(t-step)-(fabs(x-ex)+fabs(y-ey));//剪枝 if(tmp<0||tmp%2) return ; for(int i=0;i<4;i++) { int nx=x+dirx[i]; int ny=y+diry[i]; if(judgein(nx,ny)&&g[nx][ny]!='X') { g[nx][ny]='X'; dfs(nx,ny,step+1); if(escape) return ; g[nx][ny]='.'; } } return; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d%d",&n,&m,&t)) { escape=0; if(n==0&&m==0&&t==0) break; for(int i=0;i<n;i++) { getchar(); for(int j=0;j<m;j++) { scanf("%c",&g[i][j]); if(g[i][j]=='S') { sx=i; sy=j; } else if(g[i][j]=='D') { ex=i; ey=j; } } } getchar(); // printf("%d %d %d %d\n",sx,sy,ex,ey); g[sx][sy]='X'; dfs(sx,sy,0); printf("%s\n",escape?"YES":"NO"); } return 0; }</span>