亡命逃窜

时间限制: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;
}

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. Struts2实现单文件上传

    首先配置一下web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi ...

  2. UGUI Toggle控件

    今天我们来看看Toogle控件, 它由Toogle + 背景 + 打勾图片 + 标签组成的. 它主要用于单选和多选 属性讲解: Is On: 代表是否选中. Toogle Transition: 在状 ...

  3. Young Table(暴力,交换位置)

     Young Table Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submi ...

  4. Ffmpeg和SDL创建线程(转)

    Spawning Threads Overview Last time we added audio support by taking advantage of SDL's audio functi ...

  5. 跟我一起学extjs5(18--模块的新增、改动、删除操作)

    跟我一起学extjs5(18--模块的新增.改动.删除操作)         上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...

  6. [Python笔记][第一章Python基础]

    2016/1/27学习内容 第一章 Python基础 Python内置函数 见Python内置函数.md del命令 显式删除操作,列表中也可以使用. 基本输入输出 input() 读入进来永远是字符 ...

  7. 80端口被NT kernel & System 占用pid= 4的解决方法

    引用http://www.2cto.com/os/201111/111269.html的方法.亲测可用 该进程是Http.sys.它是http API的驱动组件,Http栈服务器.如果该端口被Http ...

  8. CREATE DATABASE建库语句详解

    原创地址:http://blog.csdn.net/guguda2008/article/details/5716939 一个完整的建库语句是类似这样的: IF DB_ID('TEST') IS NO ...

  9. 一.Linq to JSON是用来干什么的?

    Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和 ...

  10. 开源轻量级移动端友好的JS地图库——leaflet学习教程

    Leaflet 是一个为建设交互性好适用于移动设备地图,而开发的现代的.开源的 JavaScript 库.代码仅有 33 KB,但它具有开发在线地图的大部分功能.Leaflet设计坚持简便.高性能和可 ...