ZOJ 1940 Dungeon Master【三维BFS】
<题目链接>
题目大意:
在一个立体迷宫中,问你从起点走到终点的最少步数。
解题分析:
与普通的BFS基本类似,只需要给数组多加一维,并且走的时候多加 上、下这两个方向就行。
#include <cstdio> #include <cstring> #include <queue> #include <iostream> #include <algorithm> using namespace std; int a,b,c; char mpa[35][35][35]; int vis[35][35][35]; int dir[][3]={{1,0,0},{-1,0,0},{0,1,0},{0,0,1},{0,-1,0},{0,0,-1}}; struct node{ int x,y,z; int step; node(int a=0,int b=0,int c=0,int d=0){ x=a,y=b,z=c,step=d; } }st,et; void bfs(){ memset(vis,0,sizeof(vis)); queue<node>q; q.push(st); vis[st.x][st.y][st.z]=1; while(!q.empty()){ node now=q.front(); q.pop(); if(now.x==et.x&&now.y==et.y&&now.z==et.z){ printf("Escaped in %d minute(s).\n",now.step); return; } for(int i=0;i<6;i++){ int xx=now.x+dir[i][0]; int yy=now.y+dir[i][1]; int zz=now.z+dir[i][2]; if(xx<1||xx>a||yy<1||yy>b||zz<1||zz>c||vis[xx][yy][zz]||mpa[xx][yy][zz]=='#')continue; vis[xx][yy][zz]=1; q.push(node(xx,yy,zz,now.step+1)); } } printf("Trapped!\n"); } int main(){ while(scanf("%d %d %d",&a,&b,&c)!=EOF,a||b||c){ for(int i=1;i<=a;i++){ getchar(); for(int j=1;j<=b;j++){ scanf("%s",mpa[i][j]+1); for(int k=1;k<=c;k++){ if(mpa[i][j][k]=='S')st=node(i,j,k,0); if(mpa[i][j][k]=='E')et=node(i,j,k,0); } } } bfs(); } return 0; }
2018-08-30
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。