POJ - 2251 bfs [kuangbin带你飞]专题一

时间:2021-09-21 19:58:50

立体bfs,共有六个方向:

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

AC代码

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

const int maxn = 32;
char G[maxn][maxn][maxn];
int d[maxn][maxn][maxn];

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

int l, r, c;

struct node{
	int x, y, z;
	node(){
	}
	node(int x, int y, int z):x(x), y(y), z(z){
	}
};

int bfs(int z, int x, int y) {
	memset(d, -1, sizeof(d));
	queue<node>q;
	q.push(node(x, y, z));
	d[z][x][y] = 0;
	while(!q.empty()){
		node p =q.front();
		q.pop();
		x = p.x, y = p.y, z = p.z;
		if(G[z][x][y] == 'E') return d[z][x][y];
		for(int i = 0; i < 6; ++i){
			int px = x + dx[i], py = y + dy[i], pz = z + dz[i];
			if(px < 0 || py < 0 || pz < 0 || px >= r || py >= c || pz >= l) continue;
			if(G[pz][px][py] == '#' || d[pz][px][py] != -1) continue;
			d[pz][px][py] = d[z][x][y] + 1;
			q.push(node(px, py, pz));
		}
	}
	return -1;
}

int main(){
	while(scanf("%d%d%d", &l, &r, &c) == 3 && l){
		for(int i = 0; i < l; ++i){
			for(int j = 0; j < r; ++j) scanf("%s", G[i][j]);
		}
		int ans;
		int x, y, z;
		for(int i = 0; i < l; ++i)
			for(int j = 0; j < r; ++j)
				for(int k = 0; k < c; ++k) {
					if(G[i][j][k] == 'S') {
						z = i, x = j, y = k;
						i = l, j = r, k = c;
					}
				}
		ans = bfs(z, x, y);
		if(ans == -1) printf("Trapped!\n");
		else printf("Escaped in %d minute(s).\n", ans);
	}
	return 0;
}

如有不当之处欢迎指出!