立体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;
}

如有不当之处欢迎指出!

POJ - 2251 bfs [kuangbin带你飞]专题一的更多相关文章

  1. POJ - 3414 bfs [kuangbin带你飞]专题一

    状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可. d[i][j]表示状态A杯中水i升,B杯中水j升,总状态数量不会超过A杯的容量 * B杯的容量. AC代码 #include<cst ...

  2. POJ - 3984 bfs [kuangbin带你飞]专题一

    bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...

  3. HDU - 3533 bfs [kuangbin带你飞]专题二

    看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...

  4. HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二

    思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...

  5. UVA - 11624 多点bfs [kuangbin带你飞]专题一

    题意:某人身陷火场,总有k个点着火,着火点可向四周扩散,问此人能否逃离. 思路:可能有多个着火点,以这些着火点作为起点进行bfs,得到整个火场的最短距离,然后又以人所在坐标作为起点进行bfs,得到该人 ...

  6. FZU - 2150 bfs [kuangbin带你飞]专题一

    题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...

  7. HDU - 2612 bfs [kuangbin带你飞]专题一

    分别以两个人的家作为起点,bfs求得到每个KFC最短距离.然后枚举每个KFC,求得时间之和的最小值即可. 此题不符合实际情况之处:  通过了一个KFC再去另一个KFC可以吗? 出题人都没好好想过吗? ...

  8. HDU - 1495 bfs [kuangbin带你飞]专题一

    模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...

  9. POJ - 3087 模拟 [kuangbin带你飞]专题一

    模拟洗牌的过程,合并两堆拍的方式:使先取s2,再取s1:分离成两堆的方式:下面C张放到s1,上面C张到s2.当前牌型与第一次相同时,说明不能搜索到答案. AC代码 #include<cstdio ...

随机推荐

  1. Servlet--取得初始化配置信息

    关于这块内容,主要就是玩一个接口:ServletConfig.先翻下API,了解一下. 定义: public interface ServletConfig 这个接口定义了一个对象,通过这个对象,Se ...

  2. Servlet--ServletInputStream类,ServletOutputStream类

    ServletInputStream类 定义 public abstract class ServletInputStream extends InputStream 这个类定义了一个用来读取客户端的 ...

  3. Tomcat对Struts中的Action进行授权利

    .应用的意义 在某些应用下,如果Action类执行的功能比较重要,可以对该Action类进行授权利以实现只有特定角色的用户能够访问,此时可以在struts-config.xml文件中进行配置   2. ...

  4. Linkin大话Java和internet概念

    整理电脑,无意中翻到不知道哪里来的文章,觉得里面写的很好,仔细看过一遍后,整理了下贴了出来,其中的好多概念我觉得讲的很透彻. 既然Java不过另一种类型的程序设计语言,为什么还有这么多的人认为它是计算 ...

  5. SQL SERVER的单用户模式以及专用管理员连接

    2007-03-08 18:22:03.46 server    Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) May  3 2005 23:1 ...

  6. android studio获取sha1签名

    转载 :http://blog.csdn.net/kezhongke/article/details/42678077

  7. fullpage.js的easing参数怎样配置自定义动画

    首先看非官方文档 并没有详细的说明怎样去使用easing.js,所以我加的运动属性根本就不起作用, 再看,官方文档 Optionally, when using css3:false, you can ...

  8. java_多线程4种实现方式

    为了34月份回学校春招,不得不复习一下线程的四种实现方式,希望春招时能找到更好的公司,加油! 1.继承Thread类 class MyThread extends Thread{ private in ...

  9. [ASP.NET][Session] 使用 SQLServer 会话管理解决 Session 丢失问题

    使用 SQLServer 会话管理解决 Session 丢失问题 步骤 1.通过命令行执行 aspnet_regsql.exe 程序(不要双击安装),先在 CMD 中输入命令 cd C:\Window ...

  10. Centos系统下硬盘扩容

    装好CentOS后,发现空间太小,怎样才能增加硬盘容量?那就是再建一个硬盘: 打开虚拟经济的设置添加硬盘 查看现有的磁盘空间 fdisk -l [root@localhost ~]# fdisk -l ...