题目链接:
http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?cid=11691&pid=1005&ojid=0
解析:
本题就是一个三维的迷宫,只要把方向改成6个(上,下,左,右,前,后),再套BFS模板
#include<cstdio> #include<iostream> #include<cstring> #include<queue> using namespace std; #define MAXN 60 #define inf 999999999 typedef struct local { int z; //表示第三维坐标 int x,y; int time; }loca; int direction[6][3]={{1,0,0},{0,1,0},{-1,0,0},{0,-1,0},{0,0,1},{0,0,-1}}; typedef struct Graph { int graph[MAXN][MAXN]; }gra; gra map[MAXN]; gra visit[MAXN]; int n,m,s,ans,A,T; int check(int x,int y,int z) { if(visit[z].graph[x][y]==0&&x>=1&&x<=n&&y>=1&&y<=m&&z>=1&&z<=A&&map[z].graph[x][y]==0) { return 1; } return 0; } void BFS(loca start) { queue<loca>step; int i; loca tmp; visit[start.z].graph[start.x][start.y]=1; step.push(start); while(step.size()) { tmp=step.front(); if(tmp.z==A&&tmp.x==n&&tmp.y==m&&tmp.time<=T) { ans=tmp.time; break; } if(tmp.time>T)break; step.pop(); loca oth; int x,y,z; for(i=0;i<6;i++) { x=tmp.x+direction[i][0]; y=tmp.y+direction[i][1]; z=tmp.z+direction[i][2]; if(check(x,y,z)) { oth.time=tmp.time+1; oth.x=x; oth.y=y; oth.z=z; step.push(oth); visit[z].graph[x][y]=1; } } } } int main() { int i,j,s1,s2,t,k; loca start; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&A,&n,&m,&T); memset(visit,0,sizeof(visit)); for(i=1;i<=A;i++) { for(j=1;j<=n;j++) { for(k=1;k<=m;k++) { scanf("%d",&map[i].graph[j][k]); } } } ans=inf; start.x=1; start.y=1; start.z=1; start.time=0; BFS(start); if(ans==inf) printf("-1\n"); else printf("%d\n",ans); } return 0; }