HDU1253--胜利大逃亡--HDU1240--Asteroids!--简单三维BFS
胜利大逃亡
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 21759 Accepted Submission(s): 8538
魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.
Input中的迷宫描述,它表示的就是上图中的迷宫)
特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.
/*-----------------------------------------------------------------------
转自http://www.cnblogs.com/yuyixingkong/p/3245297.html
代码是我的..
本题是搜索题,从囚徒出发,搜索到出口的最短路线的距离值(或者反向,由出口开始,搜索到囚徒的位置的距离值),容易想到的是宽度优先搜索,首先将囚徒的点放入先进先出的一个队列,并记录走过的时间(或距离),以后不断地
(1)将队列中先进的元素推出,还原为实际储存点后,
(2)六向搜索通路点,并将搜索到的通路点放进先进先出队列。
(3)重复(1),(2),直到搜索到目标点(出口)或队列为空为止,前者只要搜索得的值低于题目给出的T值,就输出此值,其余情况输出-1;
-------------------------------------------------------------------------
本题目有几个大坑:
1,门有可能是墙壁;(墙壁不可出,但是一开始人站的地方是墙居然又可以)
2,题目给出的某些CASE的T值小于囚徒到门口的空间最短距离(A+B+C-3)。不要忘记-1的情况
3,开始可以是墙,不影响,
掉进去会使用时增多,如果你的搜索效率再不高的,就很可能超时了。
----------------------------------------------------------------------------------*/
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
这道题没什么特别难的地方,只是有几个bug要注意一下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<iomanip>
#include<queue>
#define INF 0x7ffffff
#define MAXN 51
using namespace std;
const double eps=1e-10;
int m[MAXN][MAXN][MAXN];
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
struct node
{
int a;
int b;
int c;
int n;
};
int vis[MAXN][MAXN][MAXN];
int x,y,z;
int a,b,c;
int n;
int nn;
bool ok()
{
if(x>=0&&x<a&&y>=0&&y<b&&z>=0&&z<c)
return 1;
else return 0;
}
int BFS()
{
queue<struct node> route;
struct node tem;
struct node buf;
buf.a=0;
buf.b=0;
buf.c=0;
buf.n=0;
vis[0][0][0]=1;
route.push(buf);
while(!route.empty()) {
//cout<<11111<<endl;
buf=route.front();
route.pop();
if(buf.a==a-1&&buf.b==b-1&&buf.c==c-1) {
return buf.n;
}
if(buf.n>n){
return -1;
}
//nn=buf.n+1;
for(int i=0; i<6; i++){
x=buf.a+dir[i][0];
y=buf.b+dir[i][1];
z=buf.c+dir[i][2];
if(ok()&&m[x][y][z]==0&&vis[x][y][z]==0) {
if(abs(x-a+1)+abs(y-a+1)+abs(z-c+1)+buf.n>n)//很棒的剪枝思路,见大坑2
continue;
vis[x][y][z]=1;
tem.a=x;
tem.b=y;
tem.c=z;
tem.n=buf.n+1;
route.push(tem);
}
}
}
return -1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("data2.in", "r", stdin);
#endif
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int t;
int res=0;
cin>>t;
while(t--){
a=b=c=x=y=z=0;
nn=0;
memset(vis,0,sizeof(vis));
cin>>a>>b>>c>>n;
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
for(int k=0;k<c;k++){
cin>>m[i][j][k];
}
}
}
cout<<BFS()<<endl;
}
} /*
5
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
3 3 4 20
1 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
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 1
3 3 4 10
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
3 3 4 21
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 1 0
0 1 1 0
0 1 1 0
*/ /*
11
11
-1
-1
-1
*/
还有一道一模一样的题目,在此也一并贴出
Asteroids!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 114 Accepted Submission(s): 91 |
Problem Description
You're in space.
You want to get home. There are asteroids. You don't want to hit them. |
Input
Input to this problem will consist of a (non-empty) series of up
to 100 data sets. Each data set will be formatted according to the following description, and there will be no blank lines separating data sets. A single data set has 5 components: Start line - A single line, "START N", where 1 <= N <= 10. Slice 'O' - (the letter "oh") Empty space 'X' - (upper-case) Asteroid present Starting Target Position - End line - A single line, "END" The The first coordinate in a set indicates the column. Left column = 0. The second coordinate in a set indicates the row. Top row = 0. The third coordinate in a set indicates the slice. First slice = 0. Both the Starting Position and the Target Position will be in empty space. |
Output
For each data set, there will be exactly one output set, and there will be no blank lines separating output sets.
A A move can only be |
Sample Input
START 1 |
Sample Output
1 0 |
Source
South Central USA 2001
|
Recommend
zf
|
下面是AC代码
#include <string.h>
#include <stdio.h>
#include <queue>
using namespace std; char map[][][];
int vis[][][];
int n;
int sx,sy,sz;
int ex,ey,ez;
int tx[] = {,-,,,,};
int ty[] = {,,,-,,};
int tz[] = {,,,,,-}; struct node
{
int x,y,z,step;
}; int check(int x,int y,int z)
{
if(x< || y< || z< || x>=n || y>=n || z>=n || vis[x][y][z] )
return ;
return ;
} int bfs(int x,int y,int z)
{
int i;
queue<node> Q;
node a,next;
a.x = x;
a.y = y;
a.z = z;
a.step = ;
vis[x][y][z] = ;
Q.push(a);
while(!Q.empty())
{
a = Q.front();
Q.pop();
if(a.x == ex && a.y == ey && a.z == ez)
return a.step;
for(i = ;i<;i++)
{
next = a;
next.x+=tx[i];
next.y+=ty[i];
next.z+=tz[i];
if(check(next.x,next.y,next.z))
{
next.step++;
vis[next.x][next.y][next.z] = ;
Q.push(next);
}
}
}
return -;
} int main()
{
char s[];
int i,j,k;
while(~scanf("%s%d",s,&n))
{
for(i = ;i<n;i++)
for(j = ;j<n;j++)
scanf("%s",map[i][j]);
scanf("%d%d%d%d%d%d",&sx,&sy,&sz,&ex,&ey,&ez);
scanf("%s",s);
int ans = bfs(sx,sy,sz);
if(ans>=)
printf("%d %d\n",n,ans);
else
printf("NO ROUTE\n");
} return ;
}
HDU1253--胜利大逃亡--HDU1240--Asteroids!--简单三维BFS的更多相关文章
- HDU1253 胜利大逃亡 BFS
胜利大逃亡 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ...
- HDU1253 胜利大逃亡(BFS) 2016-07-24 13:41 67人阅读 评论(0) 收藏
胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示 ...
- HDU1253 胜利大逃亡 (BFS)
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- HDU-1253 胜利大逃亡 (BFS)
此题可以做为三维深搜模板题.. 胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- HDU1253:胜利大逃亡
传送门 题意 逃离迷宫 分析 用优先队列和队列都可以,但是我vis数组写在取队列首节点就MLE了,放在放入节点的地方就ac了,看来是一种固定写法,在放入节点的地方判断,可以防止放入无效点到队列,防止队 ...
- hdu 1253:胜利大逃亡(基础广搜BFS)
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu1253胜利大逃亡(城堡的怪物太狠,主角难免天天逃亡)
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1253/ 其实就是二维扩展到三维了,增加了搜索方向,其他的没什么不同. 代码如下: #include<bit ...
- Hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
这道题的钥匙只有10个,可以压成二进制 这里有有句非常关键的话 (k & door[x][y]) == door[x][y] 一开始以为只要(k & door[x][y]) ==1就可 ...
- hdu 1240:Asteroids!(三维BFS搜索)
Asteroids! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- FreeBSD安装桌面环境
安装Xorg cd /usr/ports/x11/xorg-minimal make install clean 或 pkg install xorg-minimal 如果最小化安装xorg-serv ...
- OAuth流程
简介 OAuth是一种协议,OAuth协议为用户资源的授权提供了一个安全的.开放而又简易的标准 第三方若想访问用户资源,就必须遵守服务提供商实现的OAuth协议 OAuth授权的步骤(新浪微博为例) ...
- sql分页比较简单快捷的方法
SELECT TOP 显示数量* FROM 表 WHERE (主键id>(SELECT MAX(主键id) FROM(SELECT TOP 页码数*显示数量 主键id FROM 表 ORDER ...
- Android应用测试性能的工具Emmagee,导出文件格式问题分析
原文引用自:http://www.open-open.com/lib/view/open1367026451078.html Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资 ...
- "urllib"库的学习
在习题—41遇到这个模块/库, 有兴趣的参考下面这个网址: http://blog.sina.com.cn/s/blog_b369b20d0101kb7m.html # coding: utf-8 i ...
- 【python问题系列--4】ValueError: operands could not be broadcast together with shapes (100,3) (3,1)
背景:dataMatrix是(100,3)的列表,labelMat是(1,100)的列表,weights是(3,1)的数组,属性如下代码所示: >>> import types> ...
- ural 1091. Tmutarakan Exams(容斥原理)
1091. Tmutarakan Exams Time limit: 1.0 secondMemory limit: 64 MB University of New Tmutarakan trains ...
- visible绑定(The "visible" binding)
对visible进行绑定可以控制元素的显示和隐藏. 示例: <div data-bind="visible: shouldShowMessage"> You will ...
- CodeForces 754C Vladik and chat (DP+暴力)
题意:给定n个人的m个对话,问能不能找一个方式使得满足,上下楼层人名不同,并且自己不提及自己. 析:首先预处理每一层能有多少个user可选,dp[i][j] 表示第 i 层是不是可以选第 j 个use ...
- 【转】使用DirectUI技术实现QQ界面
转自http://bbs.csdn.net/topics/350023031 一.介绍 DirectUI技术说白了就是XML配置文件+图片+JavaScript控制界面.这点与网页css+图片+Jav ...