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 ...
随机推荐
- 解决yum命令时出现Error: xz compression not available
由于CentOS6的系统安装了epel-release-latest-7.noarch.rpm 导致在使用yum命令时出现Error: xz compression not available问题. ...
- Chapter7 迭代器
结合泛型for的所有功能,写出更加简单,高效的迭代器. 1.迭代器和closure 迭代器是一种可以遍历集合中所有元素的机制.在Lua中用函数去表示它. 每调用一次,就返回下一个元素. 迭代器在两次成 ...
- Openjudge-计算概论(A)-整数奇偶排序
描述: 输入10个整数,彼此以空格分隔重新排序以后输出(也按空格分隔),要求:1.先输出其中的奇数,并按从大到小排列:2.然后输出其中的偶数,并按从小到大排列.输入任意排序的10个整数(0-100), ...
- Objective-C和Swift实现单例的几种方式
在Swift开发中,我们对于跨类调用的变量常量,因为并没有OC中使用的全局头文件中写宏的形式,我们一般采用在类外定义全局变量/常量的形式来跨类调用.而问题在于目前写的项目需要在新添加的OC写的功能模块 ...
- 【原创】mdk5宏定义的使用小结
前几天在网上申请了一块芯片为stm32f103cbt6的小板子. 在用keil编程的过程中发现一些小问题,总结如下: 使用mdk5开发,与之前的库函数的引用方式已经改变.不需要在选项的c/c++标签页 ...
- hdu 5524 二叉树找规律,二进制相关
input n 1<=n<=1e18 output 有n个结点的满二叉树有多少个不相同结点数的子树 做法:树有h=log2(n)层,最多有2h-2种(1除外),然后再n减去u重复的即可 # ...
- php 过滤emoji表情
function yz_expression() { foreach ($_POST as $key => &$value) { $value = preg_replace_callba ...
- DNS 域名系统 (Domain Name System)
DNS 域名系统 (Domain Name System) 许多应用层软件经常直接使用域名系统 DNS (Domain Name System),但计算机的用户只是间接而不是直接使用域名系统. 因 ...
- python 自动认证登录
import urllib import base64 import urllib2 def auto_login(urllink,username,password): authstr = 'Bas ...
- JS杂记
jQuery(function($) {等于<body onload ='rickk()'>function rickk() }