分析:
BFS+队列
用队列替代递归,可以避免超时,相当于对递归进行了剪枝,提高了运行速率
#include<stdio.h> #include<queue> #include<string.h> using namespace std; struct node { int x,y,c,step; }; int t,c,n,m,time; int map[60][60][60],vis[60][60][60]; int f[6][3]= {1,0,0,0,1,0,0,0,1,-1,0,0,0,-1,0,0,0,-1}; int check(node p) { if(p.c<0||p.x<0||p.y<0||p.c>=c||p.x>=n||p.y>=m)//边界 return 0; if(vis[p.c][p.x][p.y])//如果被走过了 return 0; if(map[p.c][p.x][p.y])//如果是墙 return 0; return 1; } int bfs() { queue<node>q; node p,k; k.c=k.x=k.y=k.step=0;//初始化出发点,所用时间 q.push(k); vis[0][0][0]=1; while(!q.empty()) { k=q.front(); q.pop(); if(k.c==c-1&&k.x==n-1&&k.y==m-1)//如果到达终点,就返回所用时间 return k.step; for(int i=0; i<6; i++) { p.c=k.c+f[i][0]; p.x=k.x+f[i][1]; p.y=k.y+f[i][2]; p.step=k.step+1; if(check(p)) { q.push(p);//放入队列 vis[p.c][p.x][p.y]=1;//标记走过 } } } return -1; } int main() { scanf("%d",&t); while(t--) { int i,j,k; memset(vis,0,sizeof(vis)); scanf("%d%d%d%d",&c,&n,&m,&time); for(i=0; i<c; i++) for(j=0; j<n; j++) for(k=0; k<m; k++) scanf("%d",&map[i][j][k]); if(map[c-1][n-1][m-1])//如果出口是墙,也出不去 printf("-1\n"); else if(c+n+m-3>time)//如果总长度超过所给时间,根本就走不出去 printf("-1\n"); else printf("%d\n",bfs()); } return 0; }