您的位置:首页 > 其它

pku 2251 Dungeon Master 基本BFS

2009-12-07 12:14 218 查看
用了两种方式, 一种stl队列,一种自己实现的队列,事实证明stl就是好呀.

stl万岁.

#include <iostream>
#include <queue>
using namespace std;

int map[30][30][30];
bool visited[30][30][30];

int startx, starty, startz;
int endx, endy, endz;
int l, h, w;

int dx[] = {-1, 0, 1, 0, 0, 0};
int dy[] = {0, -1, 0, 1, 0, 0};
int dz[] = {0, 0, 0, 0, -1, 1};

inline bool ok(int x, int y, int z)
{
if(z < 0 || z >= l || y < 0 || y >= h || x < 0 || x >= w)
return false;
return true;
}

struct Point{
int x, y, z;
Point(int xx, int yy, int zz)
{x =xx;y=yy;z=zz;}
};

int step[30][30][30];

int bfs()
{
memset(visited, 0, sizeof(visited));
memset(step, 0, sizeof(step));

queue<Point> q;
q.push(Point(startx, starty, startz));
visited[startz][starty][startx] =true;

while (!q.empty())
{
Point p = q.front();
if(p.x == endx && p.y == endy && p.z == endz)
break;
q.pop();

for(int i = 0; i < 6; ++i)
{
int tempx = p.x+dx[i], tempy = p.y+dy[i], tempz = p.z+dz[i];
if(ok(tempx, tempy, tempz) && map[tempz][tempy][tempx]
&& !visited[tempz][tempy][tempx])
{
step[tempz][tempy][tempx] = step[p.z][p.y][p.x]+1;
q.push(Point(tempx, tempy, tempz));
visited[tempz][tempy][tempx] = true;
}
}
}
return step[endz][endy][endx];
}

int main()
{
char ch;

while(scanf("%d%d%d", &l, &h, &w) && !(l==0&&h==0&&w==0))
{
for(int i = 0; i < l; ++i)
for(int j = 0; j < h; ++j)
for(int k = 0; k < w; ++k)
{
cin >> ch;
if(ch == '.')
map[i][j][k] = 1;
else if(ch == '#')
map[i][j][k] = 0;
else if(ch == 'E')
{
startz = i, starty = j, startx = k;
map[i][j][k] = 2;
}
else
{
endz = i, endy = j, endx = k;
map[i][j][k] = 3;
}
}

int ret = bfs();
if(ret)
printf("Escaped in %d minute(s)./n", ret);
else
printf("Trapped!/n");
}
return 0;
}


#include <iostream>
#include <queue>
using namespace std;

int map[30][30][30];
bool visited[30][30][30];

int startx, starty, startz;
int endx, endy, endz;
int l, h, w;

int dx[] = {-1, 0, 1, 0, 0, 0};
int dy[] = {0, -1, 0, 1, 0, 0};
int dz[] = {0, 0, 0, 0, -1, 1};

inline bool ok(int x, int y, int z)
{
if(z < 0 || z >= l || y < 0 || y >= h || x < 0 || x >= w)
return false;
return true;
}

struct Point{
int x, y, z;
};

int step[30][30][30];
Point q[27000];

int bfs()
{
memset(visited, 0, sizeof(visited));
memset(step, 0, sizeof(step));

int rear = -1, front = -1;
q[++rear].x = startx;
q[rear].y = starty;
q[rear].z = startz;
visited[startz][starty][startx] =true;

while (front < rear)
{
Point p;
p.x = q[++front].x;
p.y = q[front].y;
p.z = q[front].z;
if(p.x == endx && p.y == endy && p.z == endz)
break;

for(int i = 0; i < 6; ++i)
{
int tempx = p.x+dx[i], tempy = p.y+dy[i], tempz = p.z+dz[i];
if(ok(tempx, tempy, tempz) && map[tempz][tempy][tempx]
&& !visited[tempz][tempy][tempx])
{
step[tempz][tempy][tempx] = step[p.z][p.y][p.x]+1;
q[++rear].x = tempx;
q[rear].y = tempy;
q[rear].z = tempz;
visited[tempz][tempy][tempx] = true;
}
}
}
return step[endz][endy][endx];
}

int main()
{
char ch;

while(scanf("%d%d%d", &l, &h, &w) && !(l==0&&h==0&&w==0))
{
for(int i = 0; i < l; ++i)
for(int j = 0; j < h; ++j)
for(int k = 0; k < w; ++k)
{
cin >> ch;
if(ch == '.')
map[i][j][k] = 1;
else if(ch == '#')
map[i][j][k] = 0;
else if(ch == 'E')
{
startz = i, starty = j, startx = k;
map[i][j][k] = 2;
}
else
{
endz = i, endy = j, endx = k;
map[i][j][k] = 3;
}
}

int ret = bfs();
if(ret)
printf("Escaped in %d minute(s)./n", ret);
else
printf("Trapped!/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: