2018-06-14 日常记录 POJ2251 Dungeon Master 三维BFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wannafly1995/article/details/80693176

好久没有写博客和做题了,看了学弟的blog,觉得很值得我学习!最近打算做一做kuangbin的专题训练、CodeForces的DIV以及一些水题,慢慢恢复恢复,不然编程能力下降太快!CTF方面也得学点东西了。

题目链接:http://poj.org/problem?id=2251

题目大意:一个三维迷宫,可以前后左右上下移动,不可以对角移动,有障碍物和可以通过的方块,计算入口到出口的最近距离。

分析:经典的BFS,对比二维平面多考虑一个维度即可,时间长了不写,我出现了一些问题:

(1)忘记对初始点在BFS前标注访问过;

(2)忘记考虑是否出界了==

(2)把结束点坐标也存成初始点了。。。

代码:

#include  <iostream>
#include  <cstdio>
#include  <cstring>
#include  <queue>
using namespace std;
const int MAXN = 35;
const int dx[6] = {1, -1, 0, 0, 0, 0};
const int dy[6] = {0, 0, 1, 0, -1, 0};
const int dz[6] = {0, 0, 0, 1, 0, -1}; 
int L, R, C, sx, sy, sz, ex, ey, ez;
bool vis[MAXN][MAXN][MAXN];
char maze[MAXN][MAXN][MAXN];
struct Node {
	int x, y, z, t;
	Node(int x, int y, int z, int t) {
		this->x = x;
		this->y = y;
		this->z = z;
		this->t = t;
	}
};
queue<Node> que;
void Init() {
	memset(vis, false, sizeof(vis));
	while(!que.empty()) {
		que.pop();
	}
}
bool check(int x, int y, int z) {
	if(x >= 0 && x < L && y >= 0 && y < R && z >= 0 && z < C && !vis[x][y][z] && maze[x][y][z] != '#') {
		return true;
	}
	return false;
}
int bfs() {
	vis[sx][sy][sz] = true;
	que.push(Node(sx, sy, sz, 0));
	while(!que.empty()) {
		Node temp = que.front();
		que.pop();
		int tx, ty, tz, tt;
		for(int i = 0; i < 6; i++) {
			tx = temp.x + dx[i];
			ty = temp.y + dy[i];
			tz = temp.z + dz[i];
			tt = temp.t + 1;
			if(check(tx, ty, tz)) {
				vis[tx][ty][tz] = true;
				if(tx == ex && ty == ey && tz == ez) {
					return tt;
				}
				que.push(Node(tx, ty, tz, tt));
			}
		}
	}
	return -1;
}
int main() {
	while(true) {
		scanf("%d%d%d", &L, &R, &C);
		if(L == 0 && R == 0 && C == 0) {
			break;
		}
		Init();
		for(int i = 0; i < L; i++) {
			for(int j = 0; j < R; j++) {
				scanf("%s", maze[i][j]);
				for(int k = 0; k < C; k++) {
					if(maze[i][j][k] == 'S') {
						sx = i, sy = j, sz = k;
					}
					if(maze[i][j][k] == 'E') {
						ex = i, ey = j, ez = k;
					}
				}
			}
		}
		int ans = bfs();
		if(ans == -1) {
			printf("Trapped!\n");
		} else {
			printf("Escaped in %d minute(s).\n", ans);
		}
	}
	return 0;
}
日常总结:

完成的工作:

1.完成了将静态分析结果转换成JSON文本数据;

2.将部分GraphInfo中的方法转移到Worker类中去;

3.优化了建图的方法。

下一步工作:

1.图中顶点的潜在边个数过多,只跑了50个样本就有上千条!(没想到好的方法解决);

2.利用JSON数据建图(可以立即开始);

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页