nyoj 523 亡命逃窜 【BFS】
亡命逃窜
时间限制:1000 ms | 内存限制:65535 KB
难度:4
- 描写叙述
-
从前有个叫hck的骑士,为了救我们漂亮的公主,潜入魔王的老巢,够英雄吧。只是英雄不是这么好当的。这个可怜的娃被魔王抓住了,倍受折磨,生死一线。有一天魔王出去约会了,这但是一个千载难逢的逃命机会。你如今的任务就是推断一下这个英雄未遂的孩子能不能在魔王回来之前逃出魔王的城堡,成功逃生,最后迎娶我们漂亮的公主。
魔王住在一个城堡里,城堡是一个A*B*C的立方体,能够被表示成A个B*C的矩阵,刚開始hck被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,如今知道魔王将在T分钟后回到城堡,hck每分钟能从一个坐标走到相邻的六个坐标中的当中一个.如今给你城堡的地图,请你计算出hck是否能在魔王回来前离开城堡(仅仅要走到出口就算离开城堡,假设走到出口的时候魔王刚好回来也算逃亡成功),假设能够请输出须要多少分钟才干离开,假设不能则输出-1.
如图所看到的。输入数据中的第0块的最左上角是hck被关的地方,第A-1块的最右下角是城堡的出口。依照图中红色箭头方向移动每一层以构成整个城堡。
- 输入
- 输入数据的第一行是一个正整数K,表明測试数据的数量. 每组測试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.
然后是A块输入数据(先是第0块,然后是第1块,第2块......),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,当中0代表路,1代表墙.
(假设对输入描写叙述不清楚,能够參考上面的迷宫描写叙述,它表示的就是上图中的迷宫) - 输出
- 对于每组測试数据,假设hck可以在魔王回来前离开城堡,那么请输出他最少须要多少分钟,否则输出-1.
- 例子输入
-
2 3 2 2 10 0 1 0 0 1 1 1 0 0 0 0 1 3 3 4 20 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0
- 例子输出
-
-1 11
简单的3维广搜
代码:
#include <stdio.h> #include <string.h> #include <queue> #include <algorithm> using namespace std; #define M 55 struct node{ int x, y, z; int step; }; node st, en; int map[M][M][M]; bool vis[M][M][M]; int a, b, c, t; const int dx[] = {0, 0, 0, 0, 1, -1}; const int dy[] = {0, 0, 1, -1, 0, 0}; const int dz[] = {1, -1, 0, 0, 0, 0}; int limit(node s){ return (s.x>=0&&s.x<a&&s.y>=0&&s.y<b&&s.z>=0&&s.z<c&&map[s.x][s.y][s.z] == 0); } int match(node a, node b){ return (a.x==b.x&&a.y==b.y&&a.z==b.z); } int bfs(){ queue<node> q; int i, res = 0x3f3f3f3f; vis[0][0][0] = 1; q.push(st); while(!q.empty()){ node cur = q.front(); q.pop(); for(i = 0; i < 6; i ++){ node temp = cur; temp.x += dx[i]; temp.y+=dy[i]; temp.z += dz[i]; temp.step++; if(match(temp, en)){ res = min(res, temp.step); continue; } if(limit(temp)&&!vis[temp.x][temp.y][temp.z]){ q.push(temp); vis[temp.x][temp.y][temp.z] = 1; } } } if(res > t) return -1; return res; } int main(){ int T; scanf("%d", &T); while(T --){ scanf("%d%d%d%d", &a, &b, &c, &t); memset(vis, 0, sizeof(vis)); memset(map, -1, sizeof(map)); st.x = st.y = st.z = st.step = 0; en.x = a-1, en.y = b-1, en.z = c-1; int i, j, k; for(i = 0; i < a; i ++) for(j = 0; j < b; j ++) for(k = 0; k < c; k ++) scanf("%d", &map[i][j][k]); if(match(st, en)){ printf("0\n"); continue; } if(map[a-1][b-1][c-1] == 1){ printf("-1\n"); continue; } int ans = bfs(); printf("%d\n", ans); } return 0; }