亡命逃窜

时间限制: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.
例子输入
  1. 2
  2. 3 2 2 10
  3. 0 1
  4. 0 0
  5. 1 1
  6. 1 0
  7. 0 0
  8. 0 1
  9. 3 3 4 20
  10. 0 1 1 1
  11. 0 0 1 1
  12. 0 1 1 1
  13. 1 1 1 1
  14. 1 0 0 1
  15. 0 1 1 1
  16. 0 0 0 0
  17. 0 1 1 0
  18. 0 1 1 0
例子输出
  1. -1
  2. 11

简单的3维广搜

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6. #define M 55
  7.  
  8. struct node{
  9. int x, y, z;
  10. int step;
  11. };
  12. node st, en;
  13. int map[M][M][M];
  14. bool vis[M][M][M];
  15. int a, b, c, t;
  16. const int dx[] = {0, 0, 0, 0, 1, -1};
  17. const int dy[] = {0, 0, 1, -1, 0, 0};
  18. const int dz[] = {1, -1, 0, 0, 0, 0};
  19.  
  20. int limit(node s){
  21. 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);
  22. }
  23.  
  24. int match(node a, node b){
  25. return (a.x==b.x&&a.y==b.y&&a.z==b.z);
  26. }
  27.  
  28. int bfs(){
  29. queue<node> q;
  30. int i, res = 0x3f3f3f3f;
  31. vis[0][0][0] = 1;
  32. q.push(st);
  33. while(!q.empty()){
  34. node cur = q.front();
  35. q.pop();
  36. for(i = 0; i < 6; i ++){
  37. node temp = cur;
  38. temp.x += dx[i]; temp.y+=dy[i]; temp.z += dz[i];
  39. temp.step++;
  40. if(match(temp, en)){
  41. res = min(res, temp.step);
  42. continue;
  43. }
  44. if(limit(temp)&&!vis[temp.x][temp.y][temp.z]){
  45. q.push(temp);
  46. vis[temp.x][temp.y][temp.z] = 1;
  47. }
  48. }
  49. }
  50. if(res > t) return -1;
  51. return res;
  52. }
  53.  
  54. int main(){
  55. int T;
  56. scanf("%d", &T);
  57. while(T --){
  58. scanf("%d%d%d%d", &a, &b, &c, &t);
  59. memset(vis, 0, sizeof(vis));
  60. memset(map, -1, sizeof(map));
  61. st.x = st.y = st.z = st.step = 0;
  62. en.x = a-1, en.y = b-1, en.z = c-1;
  63. int i, j, k;
  64. for(i = 0; i < a; i ++)
  65. for(j = 0; j < b; j ++)
  66. for(k = 0; k < c; k ++)
  67. scanf("%d", &map[i][j][k]);
  68. if(match(st, en)){
  69. printf("0\n"); continue;
  70. }
  71. if(map[a-1][b-1][c-1] == 1){
  72. printf("-1\n"); continue;
  73. }
  74. int ans = bfs();
  75. printf("%d\n", ans);
  76. }
  77. return 0;
  78. }

nyoj 523 亡命逃窜 【BFS】的更多相关文章

  1. HDU 1253 胜利大逃亡 NYOJ 523【BFS】

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  2. nyoj 523 双向广搜

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=523 #include<iostream> #include<cstd ...

  3. nyoj 483 Nightmare【bfs+优先队列】

    Nightmare 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Ignatius had a nightmare last night. He found him ...

  4. NYOJ 284 坦克大战 bfs + 优先队列

    这类带权的边的图,直接广搜不行,要加上优先队列,这样得到的结果才是最优的,这样每次先找权值最小的,代码如下 #include <stdio.h> #include <iostream ...

  5. nyoj三个水杯(bfs)

    三个水杯 时间限制:1000 ms  |           内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互 ...

  6. 3Ddungeon-------三维搜索-----偷个懒 把 亡命逃窜 的代码修改了一下 拿来用了

    题 很简单  就是给一个   三维的迷宫然后 开你起始地点 S 问你能不能到达 出口 E 能的话 需要多长时间 ? #include<stdio.h> #include<string ...

  7. nyoj 27-水池数目(BFS, DFS)

    27-水池数目 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:17 submit:22 题目描述: 南阳理工学院校园里有一些小河和一些湖泊,现在,我 ...

  8. nyoj 21-三个水杯(BFS)

    21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...

  9. nyoj 58-最少步数 (BFS)

    58-最少步数 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:17 submit:22 题目描述: 这有一个迷宫,有0~8行和0~8列: 1,1,1 ...

随机推荐

  1. [Oracle] Data Guard 系列(5) - 创建逻辑备库

    在创建逻辑备库之前,必须得先创建物理备库,关于如何创建物理备库,请参考<Data Guard 系列(4) - 在不停主库的情况下创建物理备库>. 1. 在物理备库上停止日志应用服务 SYS ...

  2. Linux环境Nginx安装多版本PHP

    php5.4.44 所谓多版本多版本PHP就是php5.4和5.5以及其他版本在同一台服务器. 假如php5.5是主版本已经安装在/usr/local/php目录下,那么再安装其他版本的php再指定不 ...

  3. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

  4. LR实战之Discuz开源论坛——登录脚本

    脚本业务流:访问Discuz论坛首页——登录论坛——退出论坛.本次使用LoadRunner11版本. 一.录制脚本注意 1.确保Discuz论坛能在服务器运行正常. 2.录制前先试访问Discuz论坛 ...

  5. JDBC插入百万数据,不到5秒!

    java自带的批量操作,就可以很好的支持大量数据的处理.相比c#,简单很多.c#要使用oracle提供的ODP.NET,效率才很高,但是代码却很复杂.总之,在这方面,c#没得比.当然,这里的表是没加索 ...

  6. WebApi 文件上传

    1. 注意给form表单加上enctype = "multipart/form-data" 属性,否则会导致Action的参数HttpPostedFileBase 对象接收不到文件 ...

  7. 11i - 12 How To Set Email Style Preference For All Users At Once?

    (文档 ID 578574.1) In this Document   Goal   Solution   Workflow Information Center, Diagnostics, & ...

  8. 设置启动页面-Launch Image

    一.添加启动图 二.拖入相应尺寸的图片 图片必须是png格式的.不同机型需要的图片的尺寸: iPhone4.4s-@2x 3.5寸 640*960 iPhone5.5s.5c-@2x 4.0寸 640 ...

  9. C# 中的常用正则表达式大全

       这是从网上找来的,收藏一下备用,用到之处可以节省不少时间哦! 只能输入数字: "^[0-9]*$" . 只能输入n位的数字:"^\d{n}$". 只能输入 ...

  10. Android之日期及时间选择对话框

    转:http://www.cnblogs.com/linjiqin/archive/2011/03/10/1980215.html main.xml布局文件 <?xml version=&quo ...