hdu1253胜利大逃亡 (BFS)

来源:互联网 发布:网络连接电视怎么连接 编辑:程序博客网 时间:2024/06/18 02:28

题目链接:

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 999999999typedef 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;}