胜利大逃亡

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 25112    Accepted Submission(s): 9609

Problem Description
Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.


王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在
(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城
堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请
输出需要多少分钟才能离开,如果不能则输出-1.

 
Input

入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1&
lt;=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块......),每块
输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.(如果对输入描述不清楚,可以参考Sample
Input中的迷宫描述,它表示的就是上图中的迷宫)

特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.

 
Output
对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.
 
Sample Input
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
 
Sample Output
11
 

代码:

#include <stdio.h>
#include <string.h> int map[60][60][60];
int vt[60][60][60] ; struct N
{
int x, y, z;
int cnt; }s[210000], e, f; int xx[6]={0, 0, 0, 0, 1, -1};
int yy[6]={0, 0, -1, 1, 0, 0};
int zz[6]={1, -1, 0, 0, 0, 0}; int a, b, c, tt; void bfs()
{
int i, j=0, k=0 ;
int flag = 0; e.x = 0;
e.y = 0;
e.z = 0;
e.cnt = 0; s[k++] = e;
vt[0][0][0] =1 ; while(j < k )
{
e = s[j++];
if(e.x==a-1 && e.y==b-1 && e.z==c-1 )
{
if(e.cnt <= tt)
{
printf("%d\n", e.cnt );
return ;
}
else
{
printf("-1\n");
return ;
}
} for(i=0; i<6; i++)
{
f.x = e.x + xx[i];
f.y = e.y + yy[i];
f.z = e.z + zz[i]; if( f.x>=0&&f.x<a &&f.y>=0&&f.y<b && f.z>=0 &&f.z<c&& vt[f.x][f.y][f.z]==0 && map[f.x][f.y][f.z]==1 )
{
f.cnt = e.cnt + 1;
s[k++] = f;
vt[f.x][f.y][f.z]=1;
}
}
}
printf("-1\n"); /* if(flag==1 && sum <tt )
{
printf("%d\n", sum );
}
else
{
printf("-1\n");
} */
} int main()
{
int t;
int i, j, k,ff; scanf("%d", &t) ;
while(t--)
{
memset(map, 0, sizeof(map ));
memset(vt, 0, sizeof(vt ));
k = 0; scanf("%d %d %d %d", &a, &b, &c, &tt ); for(i=0; i<a; i++)
{
for(j=0; j<b; j++)
{
for(k=0; k<c; k++)
{
scanf("%d", &ff );
if(ff==1)
map[i][j][k] = 0; //memset 为0,避免冲突修改一下,1代表路,0 代表墙
else
{
map[i][j][k] = 1;
}
}
}
} if(map[a-1][b-1][c-1]==0 || a+b+c>tt) //出口处是墙 或者 可能到达出口的最短时间都比妖怪回来的时间长必然逃不了
{
printf("-1\n");
continue;
}
bfs(); }
return 0;
}
 

最新文章

  1. Windows mysql提示:1045 access denied for user &#39;root&#39;@&#39;localhost&#39; using password yes
  2. 【转】windows消息和消息队列详解
  3. Win7下同时使用有线和无线时的优先级设置
  4. js:语言精髓笔记13--语言技巧
  5. Script: Who’s using a database link?(找出谁在使用dblink)
  6. Bootstrap_网格系统
  7. zkw费用流
  8. [知了堂学习笔记]_JSON数据操作第2讲(JSON的封装与解析)
  9. VM虚拟机安装centos,同网段,局域网能访问
  10. 《SpringMVC从入门到放肆》三、DispatcherServlet的url-pattern配置详解
  11. 2. Event编写
  12. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink
  13. 非常实用的使用eclipse的快捷键和技巧
  14. 潭州课堂25班:Ph201805201 爬虫基础 第一课 (课堂笔记)
  15. 译: 6. RabbitMQ Spring AMQP 之 RPC
  16. Linux命令echo
  17. 直面Java 第004期。
  18. Linux Web服务器网站故障分析常用的命令
  19. orace学习操作(2)
  20. [leetcode]Sum Root to Leaf Numbers @ Python

热门文章

  1. Online advertising术语
  2. appium 学习和环境搭建
  3. baksmali反编译出现:UNEXPECTED TOP-LEVEL ERROR:....Too many open files
  4. 域名解析-CNAME
  5. Android开发 adb命令提示:Permission denied (转)
  6. Linux中crontab下scp文件传输的两种方式
  7. ios NavigationViewController跳转以及返回传值
  8. 从动态获取div高度的问题展开来看
  9. php_screw加密安装
  10. vue路由vue-route