题目链接:http://poj.org/problem?id=2251
题目大意:这个题是BFS的典型模板题,只不过有趣的是它将图形由平面变为了三维立体图形,
自认为难点在输入上,采用三维字符数组,三层循环,最外层循环对应三维数组的第三维表示的就是层数。
具体代码如下:
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=50;
char map[MAXN][MAXN][MAXN];//三维字符数组
int vis[MAXN][MAXN][MAXN];//标记是否访问过
char str[MAXN];
int dirx[6]={-1,1,0,0,0,0};//可以往6个方向移动
int diry[6]={0,0,-1,1,0,0};
int dirz[6]={0,0,0,0,-1,1};
int xru,yru,zru,xcu,ycu,zcu;//入口和出口的信息
int lev,row,col;
typedef struct Node //点的信息
{
int x;
int y;
int z;
int step;
}Node;
queue <Node> Q;
void BFS()
{
vis[xru][yru][zru]=1;
Node node,t;
node.x=xru;
node.y=yru;
node.z=zru;
node.step=0;
while(!Q.empty())//重要
{
Q.pop();
}
Q.push(node);
while(!Q.empty())
{
node=Q.front();
Q.pop();
for(int i=0;i<6;i++)
{
t=node;
t.x+=dirx[i];
t.y+=diry[i];
t.z+=dirz[i];
t.step++;
if(t.x==xcu&&t.y==ycu&&t.z==zcu)
{
printf("Escaped in %d minute(s).\n",t.step);
return;
}
if(t.x<0||t.x>=row||t.y<0||t.y>=col||t.z<0||t.z>=lev||map[t.x][t.y][t.z]=='#'||vis[t.x][t.y][t.z])//不符合要求的判断有三个方向上的边界,map为石头,已经访问的点
{
continue;
}
else
{
vis[t.x][t.y][t.z]=1;//否则标记访问,压入队列中
Q.push(t);
}
}
}
printf("Trapped!\n");
return ;
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
while(scanf("%d%d%d",&lev,&row,&col)!=EOF)
{
memset(map,0,sizeof(map));
memset(str,0,sizeof(str));
memset(vis,0,sizeof(vis));
if(lev==0&&row==0&&col==0)
break;
for(int i=0;i<lev;i++)//外层循环表示层数,对应三维数组的第三维
for(int j=0;j<row;j++)//第二层循环表示行数,对应三维数组的第一维
{
scanf("%s",str);//按层输入
for(int k=0;k<col;k++)//第三层循环表示列数,对应三维数组的第二维
{
map[j][k][i]=str[k];
}
}
for(int i=0;i<lev;i++)
for(int j=0;j<row;j++)
for(int k=0;k<col;k++)//找到入口和出口
{
if(map[j][k][i]=='S')
{
xru=j;
yru=k;
zru=i;
}
if(map[j][k][i]=='E')
{
xcu=j;
ycu=k;
zcu=i;
}
}
BFS();
}
return 0;
}
仅代表个人观点,欢迎交流探讨,勿喷!
PhotoBy:WLOP