博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NYOJ-523 亡命逃窜(三维立体的BFS)
阅读量:5275 次
发布时间:2019-06-14

本文共 2727 字,大约阅读时间需要 9 分钟。

 

亡命逃窜

时间限制:
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.
样例输入
23 2 2 100 10 01 11 00 00 13 3 4 200 1 1 10 0 1 10 1 1 11 1 1 11 0 0 10 1 1 10 0 0 00 1 1 00 1 1 0
样例输出
-111
来源
上传者
 
1 #include 
2 #include
3 #include
4 #include
5 6 using namespace std; 7 8 int map[51][51][51]; 9 int dir[6][3]={
{- 1,0,0},{
0,-1,0},{
0,0,-1},{
1,0,0},{
0,1,0},{
0,0,1}};10 11 struct node12 {13 int x;14 int y;15 int z;16 int time;17 };18 19 int BFS(int a, int b, int c)20 {21 queue
q;22 node t1, t2;23 t1.time = t1.x = t1.y = t1.z = 0;24 if(t1.x == a-1 && t1.y == b-1 && t1.z == c-1)25 return t1.time;26 27 q.push(t1);28 map[0][0][0] = 1;29 while(!q.empty())30 {31 t1 = q.front();32 q.pop();33 for(int i = 0; i < 6; ++i)34 {35 t2.x = t1.x + dir[i][0];36 t2.y = t1.y + dir[i][1];37 t2.z = t1.z + dir[i][2];38 t2.time = t1.time + 1;39 if(t2.x<0 || t2.x>=a || t2.y<0 || t2.y>=b || t2.z<0 || t2.z>=c || map[t2.x][t2.y][t2.z])40 continue;41 if(t2.x == a-1 && t2.y == b-1 && t2.z == c-1)42 return t2.time;43 q.push(t2);44 map[t2.x][t2.y][t2.z] = 1;45 }46 }47 return -1;48 }49 50 int main()51 {52 int T;53 scanf("%d",&T);54 while (T--)55 {56 int a, b, c, t;57 scanf("%d%d%d%d", &a, &b, &c, &t);58 for(int i = 0; i < a; ++i)59 for(int j = 0; j < b; ++j)60 for(int k = 0; k < c; ++k)61 scanf("%d", &map[i][j][k]);62 63 int sum = BFS(a, b, c);64 if(sum <= t)65 printf("%d\n", sum);66 else67 printf("-1\n");68 }69 return 0;70 }

 

转载于:https://www.cnblogs.com/dongsheng/archive/2013/06/03/3116071.html

你可能感兴趣的文章
redis与spring结合错误情况
查看>>
第六章 字节码执行方式--解释执行和JIT
查看>>
实现绘制图形的ToolBar
查看>>
C# 串口接收数据中serialPort.close()死锁
查看>>
字符串方法title()、istitle()
查看>>
yield语句
查看>>
Html.Partial和Html. RenderPartial用法
查看>>
查看linux系统中占用cpu最高的语句
查看>>
[洛谷P1738]洛谷的文件夹
查看>>
ubuntu server设置时区和更新时间
查看>>
《弟子规》下的沉思
查看>>
设置dataGridView单元格颜色、字体、ToolTip、字体颜色
查看>>
【京东咚咚架构演进】-- 好文收藏
查看>>
【HTML】网页中如何让DIV在网页滚动到特定位置时出现
查看>>
文件序列化
查看>>
C#应用视频教程3.1 USB工业相机测试
查看>>
实验一 绘制金刚石图案
查看>>
白话SpringCloud | 第五章:服务容错保护(Hystrix)
查看>>
fabricjs 高级篇(自定义类型)
查看>>
jQuery之end()和pushStack()
查看>>