三维地图(BFS)

亡命逃窜

时间限制: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
11TLE code
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 int a,b,c,t;
 7 int map[51][51][51];
 8 int Min=100000;
 9 int dirx[4]={0,0,1,-1},diry[4]={1,-1,0,0},dirz[2]={1,-1};
10 int dfs(int z,int x,int y,int step)
11 {
12     int i,j;
13     if(step>t||z<0||z>=a||x<0||x>=b||y<0||y>=c)
14         return 0;
15     if(map[z][x][y])
16         return 0;
17     if(x==b-1&&y==c-1&&z==a-1)
18     {
19         Min=min(Min,step);
20         return 0;
21     }
22     else
23     {
24         step++;
25         map[z][x][y]=1;
26         for(i=0;i<4;i++)
27         {
28             int xx=x+dirx[i],yy=y+diry[i];
29             dfs(z,xx,yy,step);
30         }
31         for(i=0;i<2;i++)
32         {
33             int zz=z+dirz[i];
34             dfs(zz,x,y,step);
35         }
36         map[z][x][y]=0;
37     }
38     return 0;
39 }
40 int main()
41 {
42     int k,i,j,p;
43     //freopen("in.txt","r",stdin);
44     cin>>k;
45     while(k--)
46     {
47         Min=1000000;
48         cin>>a>>b>>c>>t;
49         for(i=0;i<a;i++)        //层
50             for(j=0;j<b;j++)
51                 for(p=0;p<c;p++)
52                     cin>>map[i][j][p];
53         dfs(0,0,0,0);
54         if(Min>t)
55             cout<<-1<<endl;
56         else
57             cout<<Min<<endl;
58     }
59 }
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 using namespace std;
 6 int s1[51][51][51],s2[51][51][51],a,b,c,t,sum;
 7 int go[ 6][3 ]={{- 1,0,0},{0,-1,0},{0,0,-1},{1,0,0},{0,1,0},{0,0,1}};
 8 struct node
 9 {
10 int x;
11 int y;
12 int z;
13 int time;
14 };
15 int BFS(int a,int b,int c)
16 {
17     int i;
18     queue <node> q;
19     node e,f;
20     e.time=e.x=e.y=e.z=0;
21     q.push(e);
22     s2[0][0][0]=1;
23     while (!q.empty())
24     {
25         node d=q.front();
26         q.pop();
27         if(d.x==a-1&&d.y==b-1&&d.z==c-1)
28         return d.time;
29
30         for(i=0;i<6;i++)
31         {
32             f.x=d.x+go[i][0];
33             f.y=d.y+go[i][1];
34             f.z=d.z+go[i][2];
35             f.time=d.time+1;
36             if(f.x<0||f.x>=a||f.y<0||f.y>=b||f.z<0||f.z>=c||s1[f.x][f.y][f.z]||s2[f.x][f.y][f.z])
37                 continue;
38             q.push(f);
39             s2[f.x][f.y][f.z]=1;
40         }
41     }
42     return -1;
43 }
44 int main()
45 {
46     int l,i,j,k;
47     scanf("%d",&l);
48     while (l--)
49     {
50         scanf("%d%d%d%d",&a,&b,&c,&t);
51         for(i=0;i<a;i++)
52             for(j=0;j<b;j++)
53                 for(k=0;k<c;k++)
54                 {
55                     scanf("%d",&s1[i][j][k]);
56                     s2[i][j][k]=0;
57                 }
58         sum=BFS(a,b,c);
59         if(sum<=t)
60         printf("%d\n",sum);
61         else
62         printf("-1\n");
63     }
64 }

时间: 2024-10-20 02:14:36

三维地图(BFS)的相关文章

poj 2251 三维地图bfs

三维地图 poj 2251 #include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; char map[35][35][35]; int l,r,c; bool book[35][35][35]; // 定义 东西南北和上下 struct dis{ int x,y,z; int step; dis(int x,int y,int z,i

hdu1240 三维搜索 bfs dfs都可以

题意,给出一个N,这是这个三空间的大小,然后给出所有面的状况O为空地,X为墙,再给出起始点的三维坐标和终点的坐标,输出到达的步数三维的BFS,很裸的题,不过一定要注意这一题给的坐标x表示列,y表示行,z表示层,实际输入的时候调试一下看看给的坐标是不是跟样例在图中所指的对象一样就行了.http://blog.csdn.net/iaccepted/article/details/23277717bfs讲得好http://iprai.hust.edu.cn/icl2002/algorithm/algo

如何屏蔽SkylineGlobe提供的三维地图控件上的快捷键

SkyllineGlobe提供的 <OBJECT ID=" TerraExplorer3DWindow" CLASSID="CLSID:3a4f9192-65a8-11d5-85c1-0001023952c1" width=500 height=400></OBJECT>可以用来加载显示FLY格式的三维地图工程,可以嵌入到HTML页面中. 这个三维地图控件里,封装了在TerraExplorer中的一些快捷键,比如控制方向的"Q/W/

网页三维地图技术初探

根据是否需要加载地图服务器中的资源将网页三维地图技术分为两大类: 一.需要服务器配合的 1.cesiumjs    网址:http://www.cesiumjs.org 许可证:Apache 2.0 license 可以在调整经纬度,但是不能调整人眼的视角,也就是地球的轴线不能在显示器的平面中旋转. 优点:可以绘制三维数据,圆柱圆锥.卫星 2.openwebglobe 网址:http://www.openwebglobe.org/ 许可证:Open source licenced under M

[原创.数据可视化系列之二]使用cesium三维地图展示美国全球军事基地分布

基于浏览器的三维地图还算是一个比较高冷的东西,最主要的技术难点是如何在浏览器上 多快好省 的显示三维数据,很遗憾,还真的没有太好的的方案,只能说还有可行的方案. 很久之前用过skyline,使用CS居多,也可以在浏览器使用actviex插件显示:另外就是arcgis globe,我没看到在项目中用的.后来google有一个globe,算是差的比较远. 一直到有一天,看到nokia的地图,没错,就是那个做手机的nokia,他们做的那个一个here.com 的地图,能够看三维地图,使用webgl在浏

[Swift通天遁地]一、超级工具-(10)使用地图视图MKMapView的相机功能实现创建三维地图

本文将演示使用地图视图MKMapView的相机功能实现创建三维地图. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 //在当前的类文件中引入所需的类库 3 import MapKit 4 5 class ViewController: UIViewController { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additiona

# codeforces 1272 F. Two Bracket Sequences(三维dp + bfs)

codeforces 1272 F. Two Bracket Sequences(三维dp + bfs) 题目大意 输入两个括号序列 s,t(不一定合法),你需要构造一个尽可能短的合法括号序列使得s,t 都是这个序列的子序列(子序列意味着不用连续) 解题思路 dp[i][j][k]表示匹配到s的第i个字符,匹配到t的第j个字符,并且此时(的个数比)多k个的时候的最小合法序列长度,k的上限是200(s和t中最多200个(或者)). 状态转移: 枚举答案合法序列的每一位是放置(或者) ? 放置(,如

用three.js开发三维地图实例

公司要做智慧消防楼层可视化,需要用到web3d,开源的引擎中先研究了cesium三维地球,但cesium做楼层感觉是大材小用,而且体验也不好,最终选用的是功能强大.更适合小型场景的three. three是图形引擎,而web二维三维地图都是基于图形引擎的,所以拿three来开发需求简单的三维地图应用是没什么问题的. 1.坐标转换 实际地理坐标为经度.纬度.高度,而three.js使用的是右手坐标系x.y.z,本来考虑的是将经纬度坐标转换成墨卡托,再去和three的坐标系对应.而实际项目中,经纬度

POJ2251Dungeon Master(三维图)(BFS)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17444   Accepted: 6790 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled