HDU 1253 (简单三维广搜) 胜利大逃亡
奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz
而且我也优化过了的啊,尼玛还是一直爆!
先把代码贴上睡觉去了,明天再来弄
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std; struct Point
{
int x, y, z;
int steps;
}start; int a, b, c, m;
int map[][][];
int dir[][] = {{,,}, {-,,}, {,,}, {,-,}, {,,}, {,,-}}; bool islegal(int x, int y, int z)
{
return (x>= && x<a && y>= && y<b && z>= && z<c && (map[x][y][z] == ));
} void BFS(void)
{
queue<Point> qu;
start.x = start.y = start.z = start.steps = ;
map[][][] = ;
qu.push(start);
while(!qu.empty())
{
Point fir = qu.front();
qu.pop();
if(fir.x==a- && fir.y==b- && fir.z==c-)
{printf("%d\n", fir.steps); return;}
if(fir.steps > m)
{printf("-1\n"); return;}
for(int i = ; i < ; ++i)
{
int xx = fir.x + dir[i][];
int yy = fir.y + dir[i][];
int zz = fir.z + dir[i][];
if(islegal(xx, yy, zz))
{
Point next;
next.x = xx, next.y = yy, next.z = zz;
next.steps = fir.steps + ;
map[zz][xx][yy] = ;
if(abs(xx-a+)+abs(yy-b+)+abs(zz-c+)+next.steps > m)
continue;
qu.push(next);
}
}
}
printf("-1\n");
} int main(void)
{
#ifdef LOCAL
freopen("1253in.txt", "r", stdin);
#endif int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d%d", &a, &b, &c, &m);
for(int i = ; i < a; ++i)
for(int j = ; j < b; ++j)
for(int k = ; k < c; ++k)
scanf("%d", &map[i][j][k]); BFS();
}
return ;
}
代码君
最终还是自己用数组模拟队列A过去了
一个优化:
因为题目要求在规定时间内走出迷宫,如果出口距离当前位置太远(即使在没有墙壁阻挡的情况下也走不到),那么就可以直接输出-1了
这个优化让900+MS的运行时间减少到了500+MS,还是比较给力的
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = **+;
int head, tail;
struct Point
{
int x, y, z;
int steps;
}qu[maxn]; int a, b, c, m;
int map[][][];
int dir[][] = {{,,}, {-,,}, {,,}, {,-,}, {,,}, {,,-}}; bool islegal(int x, int y, int z)
{
return (x>= && x<a && y>= && y<b && z>= && z<c && (map[x][y][z] == ));
} void BFS(void)
{
qu[].x = qu[].y = qu[].z = qu[].steps = ;
head = , tail = ;
while(head < tail)
{
if(qu[head].steps > m)
{printf("-1\n"); return;}
if(qu[head].x==a- && qu[head].y==b- && qu[head].z==c-)
{printf("%d\n", qu[head].steps); return;}
for(int i = ; i < ; ++i)
{
int xx = qu[head].x + dir[i][];
int yy = qu[head].y + dir[i][];
int zz = qu[head].z + dir[i][];
if(islegal(xx, yy, zz))
{
map[xx][yy][zz] = ;
if(a+b+c--xx-yy-zz > m-qu[head].steps-) //优化
continue;
qu[tail].x = xx;
qu[tail].y = yy;
qu[tail].z = zz;
qu[tail++].steps = qu[head].steps + ;
}
}
++head;
}
printf("-1\n");
} int main(void)
{
#ifdef LOCAL
freopen("1253in.txt", "r", stdin);
#endif int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d%d", &a, &b, &c, &m);
for(int i = ; i < a; ++i)
for(int j = ; j < b; ++j)
for(int k = ; k < c; ++k)
scanf("%d", &map[i][j][k]); //map[0][0][0] = 1;
BFS();
}
return ;
}
代码君
HDU 1253 (简单三维广搜) 胜利大逃亡的更多相关文章
- HDU 1240 (简单三维广搜) Asteroids!
给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很 ...
- hdu 1240(三维广搜)
题意: 有一个n*n*n的三维空间. 给你起始坐标和终点坐标.要你从起点到终点,问最少需要多少步走出去.如果走不出去则输出"NO ROUTE". 空间中 'O' 表示这个点可以走, ...
- 三维bfs(HUD1253胜利大逃亡)
#include <stdio.h>#include <string.h>int map[51][51][51];int v[51][51][51];int a,b,c,t11 ...
- hdu 1253:胜利大逃亡(基础广搜BFS)
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDU 1253:胜利大逃亡(简单三维BFS)
pid=1253">胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- hdu 1253 胜利大逃亡 (三维简单bfs+剪枝)
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- [ACM] hdu 1253 胜利大逃亡 (三维BFS)
胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这但是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,能够被表示 ...
- hdu 1253 胜利大逃亡 (代码详解)解题报告
胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示 ...
- HDU 1253 胜利大逃亡 NYOJ 523【BFS】
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
随机推荐
- Sqli-labs less 31
Less-31 Less-31与上述两个例子的方式是一样的,我们直接看到less-31的sql语句: 所以payload为: http://127.0.0.1:8080/sqli-labs/Less- ...
- 分布式数据存储 - Zabbix监控MySQL性能
Zabbix如何监控mysql性能,我们可以使用mysql自带的模板,可以监控如下内容:OPS(增删改查).mysql请求流量带宽,mysql响应流量带宽,最后会附上相应的监控图! 编写check_m ...
- HDU 4572 Bottles Arrangement(找规律,仔细读题)
题目 //找规律,123321123321123321…发现这样排列恰好可以错开 // 其中注意题中数据范围: M是行,N是列,3 <= N < 2×M //则猜测:m,m,m-1,m-1 ...
- POJ 2017
#include<iostream> #include<stdio.h> using namespace std; int main() { //freopen("t ...
- spring mvc绑定对象String转Date解决入参不能是Date的问题
使用spring的mvc,直接将页面参数绑定到对象中,对象中有属性为Date时会报错,此时需要处理下. 同样的,其他的需要处理的类型也可以用这种方法. 在controller中加入代码 @InitBi ...
- 重载和覆盖的区别?(overload vs override)
override与overload的区别? override 表示重写,overload 表示重载.override是子类和父类之间的关系,是垂直关系:overload是同一个类中方法之间的关系,是水 ...
- Axis2学习的第一天
按照下面,分别建2个工程,一个client(客户端),一个server(服务端) 先实现服务端: 1.编写services.xml文件,该文件是放在aar文件里的\META-INF目录下的: < ...
- 内存就是RAM?
内存不全是RAM,让我们看看当今的Intel计算机是如何连接各个组件的吧.下图展示了主板上的主要组件: 现代主板的示意图,北桥和南桥构成了芯片组. 当你看图时,请牢记一个至关重要的事实:CPU一点也不 ...
- AcmeAir安装AI探针--企业版
通过脚本安装AI探针请点击通过脚本自动安装探针 一.安装企业版AI探针准备工作: 1. 准备好可用的docker版AcmeAir应用 2. 准备好可用的企业版AIServer 3. 下载好合适版本的J ...
- 如何在Java客户端调用RESTful服务
在这个例子中,我们将看到如何使用java.net包实用工具,创建一个访问REST服务RESTful的客户端.当然这不是创建一个RESTful客户端最简单的方法,因为你必须自己读取服务器端的响应,以及J ...