POJ-2251-Dungeon Master

POJ-2251-Dungeon Master

http://poj.org/problem?id=2251

基本的三维BFS,用队列写的

POJ-2251-Dungeon Master_第1张图片

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
int n1,n2,n3;
char map[40][40][40];
int visit[40][40][40];
int dir[6][3]={{1,0,0},{-1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
struct node
{
	int x;
	int y;
	int z;
	int time;
};
int go(int x,int y,int z)
{
	if(0<=x&&x<n1&&0<=y&&y<n2&&0<=z&&z<n3&&map[x][y][z]=='.')
	return 1;
	return 0;
}
int bfs(node s1,node s2)
{
	int i;
	queue<node>q;
    node st,ed;
	st.x=s1.x;
	st.y=s1.y;
	st.z=s1.z;
	st.time=0;
	memset(visit,0,sizeof(visit));
	visit[st.x][st.y][st.z]=1;
	map[s2.x][s2.y][s2.z]='.';
	q.push(st);
    while(!q.empty())
	{
		st=q.front();
		q.pop();
		if(st.x==s2.x&&st.y==s2.y&&st.z==s2.z)
		return st.time;
        for(i=0;i<6;i++)
		{
			ed.x=st.x+dir[i][0];
			ed.y=st.y+dir[i][1];
			ed.z=st.z+dir[i][2];
			if(!visit[ed.x][ed.y][ed.z]&&go(ed.x,ed.y,ed.z))
			{
				ed.time=st.time+1;
				visit[ed.x][ed.y][ed.z]=1;
				q.push(ed);
			}
		}
	}
	return -1;
}
int main()
{
	node st,ed;
	int i,j,k,ans;
	while(scanf("%d%d%d",&n1,&n2,&n3),n1||n2||n3)
	{
		for(i=0;i<n1;i++)
		{
			getchar();
			for(j=0;j<n2;j++)
		    scanf("%s",map[i][j]);
		}
		for(i=0;i<n1;i++)
		for(j=0;j<n2;j++)
		for(k=0;k<n3;k++)
		{
			if(map[i][j][k]=='S')
			{
				st.x=i;
				st.y=j;
				st.z=k;
			}
			else if(map[i][j][k]=='E')
			{
				ed.x=i;
				ed.y=j;
				ed.z=k;
			}
		}
		ans=bfs(st,ed);
		if(ans==-1)
		printf("Trapped!\n");
		else
		printf("Escaped in %d minute(s).\n",ans);
	}
	return 0;
}


你可能感兴趣的:(struct,Go,n2)