Week12 作业 B - POJ - 2251

题目描述:

zjm被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成。
zjm每次向上下前后左右移动一个单位需要一分钟,且zjm不能对角线移动。
空间的四周封闭。zjm的目标是走到空间的出口。
是否存在逃出生天的可能性?如果存在,则需要多少时间?

思路:

因为要求的是最短时间,所以在三维数组上跑BFS即可

不能对角线移动,所以在一个点只有上下左右前后六种移动方案

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int dx[]={0,0,0,-1,0,1,0};  
int dy[]={0,0,0,0,1,0,-1};
int dz[]={0,1,-1,0,0,0,0};     //6 directions : up down front right back left
int Z,X,Y;
int G[35][35][35],vis[35][35][35];
int Sx,Sy,Sz;
int Tx,Ty,Tz;
struct Point
{
	int x,y,z;
	int dep;
};
int bfs()
{
	queue<Point> q;
	q.push({Sx,Sy,Sz,0});
	vis[Sx][Sy][Sz]=1;
	while(!q.empty())
	{
		Point now=q.front();
		q.pop();
		if(now.x==Tx&&now.y==Ty&&now.z==Tz) 	return now.dep;
		for(int i=1;i<=6;i++)
		{
			int nx=dx[i]+now.x,ny=dy[i]+now.y,nz=dz[i]+now.z;
			if(nx>=1&&nx<=X&&ny>=1&&ny<=Y&&nz>=1&&nz<=Z&&G[nx][ny][nz]==0
				&&vis[nx][ny][nz]==0)
			{
				q.push({nx,ny,nz,now.dep+1});
				vis[nx][ny][nz]=1;
			}
		}
	}
	return -1;
}
int main()
{
	while(scanf("%d %d %d",&Z,&X,&Y) ==3 && !(X==0&&Y==0&&Z==0))
	{
		memset(G,0,sizeof(G));
		memset(vis,0,sizeof(vis));
		for(int k=1;k<=Z;k++)
			for(int i=1;i<=X;i++)
			{
				string s;
				cin>>s;
				for(int j=0,n=s.size();j<n;j++)
				{
					if(s[j]=='S') Sx=i,Sy=j+1,Sz=k;
					else if(s[j]=='#') G[i][j+1][k]=1;
					else if(s[j]=='E') Tx=i,Ty=j+1,Tz=k;
				}
			}
		int ans=bfs();
		if(ans==-1) cout<<"Trapped!"<<endl;
		else printf("Escaped in %d minute(s).\n",ans);
	}
	return 0;
}

  

posted @ 2020-05-28 21:02  菜鸡今天学习了吗  阅读(103)  评论(0编辑  收藏  举报