NYOJ 523

简介:   亡命逃窜 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述   从前有个叫hck的骑士,为了救我们美丽的公主,潜入魔王的老巢,够英雄吧。不过英雄不是这么好当的。

 

亡命逃窜

时间限制: 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
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 using namespace std;
 5 
 6 int map[55][55][55],f[]={1,-1,0,0,0,0},g[]={0,0,1,-1,0,0},w[]={0,0,0,0,1,-1};
 7 bool vis[55][55][55],flag;
 8 struct Node
 9 {
10     int x,y,z,step;
11 };
12 
13 int bfs(int a,int b,int c,int time)
14 {
15     int i,j,k;
16      int r,s,t;
17     memset(vis,0,sizeof(vis));
18     queue <Node> q;
19     Node temp={0,0,0,time};
20     vis[0][0][0]=1;
21     q.push(temp);
22     while(!q.empty())
23     {
24         temp=q.front();
25         q.pop();
26         for(i=0;i<6;i++)
27         {
28             r=temp.x+f[i];
29             s=temp.y+g[i];
30             t=temp.z+w[i];
31             if(r>=0&&r<a&&s>=0&&s<b&&t>=0&&t<c&&vis[r][s][t]==0)
32             {
33                 if(r==a-1&&s==b-1&&t==c-1&&map[r][s][t]==0&&temp.step-1>=0)
34                 {
35                     flag=1;
36                     break;
37                 }
38                 else if(map[r][s][t]==0&&temp.step-1)
39                 {
40                     Node next={r,s,t,temp.step-1};
41                     q.push(next);
42                     vis[r][s][t]=1;
43                 }    
44             }
45         }
46         if(flag==1||temp.step-1==0)
47             break;
48     }
49     while(!q.empty())
50         q.pop();
51     return time-(temp.step-1);
52 }
53 
54 int main()
55 {
56     int a,b,c;
57      int i,j,k,T;
58      int time;
59     scanf("%d",&T);
60     while(T--)
61     {
62         memset(map,0,sizeof(map));
63         flag=0;
64         scanf("%d%d%d%d",&a,&b,&c,&time);
65         for(k=0;k<a;k++)
66         {
67             for(i=0;i<b;i++)
68             {
69                 for(j=0;j<c;j++)
70                 {
71                     scanf("%d",&map[k][i][j]);
72                 }
73             }
74         }
75         int cnt=bfs(a,b,c,time);
76         if(flag==1)
77             printf("%d\n",cnt);
78         else
79             printf("-1\n");
80     }
81     return 0;
82 }        

 

目录
相关文章
|
API
NYOJ 540
  为了给学弟学妹讲课,我水了一道题…… import java.util.Arrays; import java.util.Scanner; public class NYOJ540 { public static void main(String[] args) { ...
799 0
|
测试技术
NYOJ 541
  最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业。但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争。
751 0
NYOJ 506
  洗澡 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 Mostrp是个爱干净的好少年。 有一次去澡堂洗澡时发现 澡堂的澡柜编号中没有出现过数字‘4’。
795 0
|
定位技术
NYOJ 20
  吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。
799 0
|
人工智能
NYOJ 55
  懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 小明很想吃果子,正好果园果子熟了。在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
925 0
NYOJ 27
  水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。
764 0
NYOJ 113
1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int pos=-1; 8 string s; 9 while(getline(cin,s)) 10 { 11 while((pos=s.
659 0
NYOJ 123(插线问点)
  士兵杀敌(四) 时间限制:2000 ms | 内存限制:65535 KB 难度:5   描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就是在南将军询问他某个人的军功的时候,快速的报出此人的军功,请你编写一个程序来帮助小工吧。
807 0
|
网络协议
NYOJ 8
  一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);1.
762 0