pku 2251 Dungeon Master 基本BFS
2009-12-07 12:14
218 查看
用了两种方式, 一种stl队列,一种自己实现的队列,事实证明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; }
相关文章推荐
- POJ 2251 Dungeon Master(bfs)
- poj 2251 Dungeon Master 【bfs基础题】
- POJ 2251 Dungeon Master (三维BFS)
- 【POJ 2251】Dungeon Master(bfs)
- poj-2251-Dungeon Master-BFS
- POJ 2251 Dungeon Master (bfs)
- POJ-2251 Dungeon Master (BFS模板题)
- POJ 2251 Dungeon Master (BFS)
- POJ 2251 Dungeon Master(BFS+数据读取)
- Dungeon Master 和上题基本相同 bfs(),求最优值 不同的是三维bfs(),存储有技巧 (u=x*r*c+y*c+z);
- POJ - 2251 Dungeon Master(BFS)
- POJ-2251 Dungeon Master(简单的三维bfs)
- poj 2251 Dungeon Master(多起点bfs)
- POJ 2251 Dungeon Master :NYOJ 353 3D dungeon (三维空间上的搜索 bfs )
- POJ 2251 Dungeon Master(bfs)
- 算法训练之BFS POJ 2251 Dungeon Master 三维最短路径
- poj 2251 Dungeon Master(BFS)
- POJ 2251 Dungeon Master(BFS)
- poj-2251-Dungeon Master(bfs)
- poj 1321 棋盘问题 - DFS 2251 Dungeon Master - BFS