POJ 2251

思路还是很清晰的,就是三维空间中运用BFS的方法,中间不幸WA过两次,问题出在这里:因为想要将dungeon的周边铺满'#',这样做的好处就是判断移动的下一步是不是还在dungeon内,可以不用一组较为耗时的不等式,不过隐患在于三维空间中,一定要记住不重不漏的填补'#',此外,填充的顺序也至关重要,这道题之前提交错误就错在其他地方都已经封装好,可惜忘记封顶,这样有可能导致直接就跳出去并被之前的测试数据所影响。

其实一开始应该在每个循环初始化的时候全局填充为'#',这样省事,而且时间复杂度也不是多高
总之,边界条件一定要非常的慎重,考虑周到是训练的重要内容

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
using namespace std;

const int maxs= 35;

struct Node
{
	int i, j, k;
	Node(int _i= 0 ,int _j= 0, int _k= 0) : i(_i), j(_j), k(_k) {}
};
int step[6][3]= {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
char du[maxs][maxs][maxs];
int l, r, c;
int si, sj, sk;
bool vis[maxs][maxs][maxs];
int dis[maxs][maxs][maxs];

int BFS()
{
	queue<Node> Q;
	memset(vis, 0, sizeof(vis));
	vis[si][sj][sk]= 1;
	dis[si][sj][sk]= 0;
	Q.push(Node(si, sj, sk));
	Node cur;
	int i, j, k, v;

	while (!Q.empty()){
		cur= Q.front();
		Q.pop();
		i= cur.i;
		j= cur.j;
		k= cur.k;
		v= dis[i][j][k]+1;

		for (int p= 0; p< 6; ++p){
			int ni= i+step[p][0], nj= j+step[p][1], nk= k+step[p][2];
			if ('E'== du[ni][nj][nk]){
				return v;
			}
			if ('.'== du[ni][nj][nk] && !vis[ni][nj][nk]){
				vis[ni][nj][nk]= 1;
				dis[ni][nj][nk]= v;
				Q.push(Node(ni, nj, nk));
			}
		}
	}

	return -1;
}

int main(int argc, char const *argv[])
{
	memset(du[0], '#', sizeof(du[0]));
	while (~scanf("%d %d %d", &l, &r, &c) && l){
		for (int i= 1; i<= l; ++i){
			memset(du[i][0], '#', sizeof(du[i][0]));
			memset(du[i][r+1], '#', sizeof(du[i][r+1]));
			for (int j= 1; j<= r; ++j){
				scanf(" %s", du[i][j]+1);
				for (int k= 1; k<= c; ++k){
					if ('S'== du[i][j][k]){
						si= i;
						sj= j;
						sk= k;
						break;
					}
				}
				du[i][j][0]= du[i][j][c+1]= '#';
			}
		}
		memset(du[l+1], '#', sizeof(du[l+1]));
		int ans= BFS();
		if (-1== ans){
			printf("Trapped!
");
		}
		else{
			printf("Escaped in %d minute(s).
", ans);
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Idi0t-N3/p/14687391.html