uva532(三维简单宽度优先搜索)
2015-10-02 23:09
393 查看
简单不解释。。。
/***************************************** Author :Crazy_AC(JamesQi) Time :2015 File Name : *****************************************/ // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <string> #include <stack> #include <queue> #include <deque> #include <vector> #include <map> #include <set> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <limits.h> using namespace std; #define MEM(a,b) memset(a,b,sizeof a) typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> ii; const int inf = 1 << 30; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; inline int Readint(){ char c = getchar(); while(!isdigit(c)) c = getchar(); int x = 0; while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); } return x; } char mp[40][40][40]; int d[40][40][40]; int dx[] = {1,-1,0,0,0,0}; int dy[] = {0,0,1,-1,0,0}; int dz[] = {0,0,0,0,1,-1}; struct node{ int x,y,z; int dis; node(){} node(int x,int y,int z,int dis):x(x),y(y),z(z),dis(dis){} }; int n,m,c; bool check(int x,int y,int z){ if (x < 0 || x >= n) return false;//[0,n - 1] if (y < 0 || y >= m) return false;//[0,m - 1] if (z < 0 || z >= c) return false;//[0,c - 1] return true; } bool bfs(int x,int y,int z){ node tmp = node(x,y,z,0); queue<node> que; que.push(tmp); while(!que.empty()){ tmp = que.front(); que.pop(); if (mp[tmp.x][tmp.y][tmp.z] == 'E') return true; for (int i = 0;i < 6;i++){ int nx = tmp.x + dx[i]; int ny = tmp.y + dy[i]; int nz = tmp.z + dz[i]; if (!check(nx,ny,nz)) continue; if (d[nx][ny][nz] == 0 && mp[nx][ny][nz] != '#' && mp[nx][ny][nz] != 'S'){ d[nx][ny][nz] = tmp.dis + 1; if (mp[nx][ny][nz] == 'E') return true; que.push(node(nx,ny,nz,d[nx][ny][nz])); } } } return false; } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); while(~scanf("%d%d%d",&n,&m,&c) && (n || m || c)){ int x,y,z; int tx,ty,tz; memset(d, 0,sizeof d); memset(mp, 0,sizeof mp); for (int i = 0;i < n;i++){ for (int j = 0;j < m;j++){ scanf("%s",mp[i][j]); for (int k = 0;k < c;k++){ if (mp[i][j][k] == 'S'){ x = i; y = j; z = k; } if (mp[i][j][k] == 'E'){ tx = i; ty = j; tz = k; } } } } if (bfs(x,y,z)) printf("Escaped in %d minute(s).\n",d[tx][ty][tz]); else printf("Trapped!\n"); } return 0; }
相关文章推荐
- eclipise快捷键,留给以后备用
- fedora安装软件
- jquery td 点击改变颜色
- 黑马程序员——面向对象之包
- linux下库的介绍与使用
- 创业的第五十一天
- 生命周期
- Call call=(Call)service.createCall()报错
- 中国LINUX内核开发大会 ppt演讲资料 与 会议视频
- 深入浅出MFC——消息映射与命令传递(六)
- sublime text 3神奇的插件--snippet
- hdu 4777
- C#自定义窗口
- Fedora查看内核及发行版本号
- 影响CPSR状态寄存器的ARM汇编指令--总结
- POJ 3696 The Luckiest number 欧拉函数 或 BSGS
- 数据库事务隔离级别
- 值得推荐的C/C++框架和库
- git pull
- 【python】正则表达式相关