您的位置:首页 > 其它

UVA532-Dungeon Master(三维迷宫)

2012-11-29 12:48 281 查看
还是广搜的题,只不过题意有点吓人,什么三维的迷宫,搜索最短的路径。

题目不难。不作多余的解释;

代码如下:

#include <iostream>
#include <cstring>
using namespace std;
struct Node{
int x,y,z,len;
};
char ch[40][40][40];
bool vis[40][40][40];
int go[6][3] = {{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,1},{0,0,-1}};//需要遍历的六个方向
int l, r, c, x_, y_ , z_;
Node node[30000];//用于存储节点的队列
int pan(int x,int y, int z)
{
if(x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<c&&!vis[x][y][z]&&ch[x][y][z]=='.')return 1;
return 0;
}
void input()
{
for(int i = 0; i < l; i++,cin.ignore())
for(int j = 0; j < r; j++,cin.ignore())
for(int k = 0; k < c; k++)
{
ch[i][j][k] = cin.get();
if(ch[i][j][k] == 'S'){x_ = i; y_ = j; z_ = k;}//输入的时候就把起点找出来
}
}
int bfs()
{
int rear = 0, front = 0;
node[0].x = x_; node[0].y = y_; node[0].z = z_; node[0].len = 0;
while(front>=rear)
{
int _x = node[rear].x, _y = node[rear].y, _z = node[rear].z, _len = node[rear].len;
int fx, fy, fz, flen;
for(int i = 0; i < 6; i++)
{
fx = _x+go[i][0]; fy = _y+go[i][1]; fz = _z+go[i][2], flen = _len+1;
if(ch[fx][fy][fz] == 'E'){return flen;}
if(pan(fx, fy, fz)){++front;node[front].x = fx;node[front].y = fy; node[front].z = fz; node[front].len = flen;}
vis[fx][fy][fz] = 1;
}
rear++;
}
return 0;
}
int main ()
{
int len;
while(cin>>l>>r>>c&&l&&r&&c)
{
cin.get(); //需要特别注意之处,还要把回车读取了。
memset(ch,0,sizeof(ch));
memset(vis,0,sizeof(vis));
len = 0;
input();//cout<<"end";
len = bfs();
if(len)cout<<"Escaped in "<<len<<" minute(s)."<<endl;
else cout<<"Trapped!"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: