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 ...
随机推荐
- [大牛翻译系列]Hadoop(5)MapReduce 排序:次排序(Secondary sort)
4.2 排序(SORT) 在MapReduce中,排序的目的有两个: MapReduce可以通过排序将Map输出的键分组.然后每组键调用一次reduce. 在某些需要排序的特定场景中,用户可以将作业( ...
- iOS音效
//AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service) //System Sound S ...
- mvc5 错误页如何定义
项目根目录下的Web.config <system.web> <customErrors mode="On" defaultRedirect="~/Er ...
- 深入Java集合学习系列:HashMap的实现原理--转
原文出自:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html 1. HashMap概述: HashMap是基于哈希表的Ma ...
- jQuery年月日(生日)选择器
我们在编辑用户资料时经常会遇到选择生日选项的问题,今天我给大家介绍如何使用js来实现年月日(生日)选择器,能够准确计算闰年的年月日,方便表单处理. 文章:http://www.helloweba.co ...
- hive-学习笔记
1.hive模糊搜索表 show tables like '*name*'; 2.查看表结构信息 desc formatted table_name; desc table_name; 3.查看 ...
- Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑
一.概述 1.目标:动态代理的代理逻辑可以任意修改 2.思路: (1)要把代理逻辑抽离,站在jvm的角度思考,应独立出InvocationHandler接口,并接收被代理的对象及方法作为参数invok ...
- Redis的String操作
set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] 如: set a 1 ex 10 , 10秒有效 Set a 1 px 9000 , 9秒有效 注: 如果ex, ...
- Linux命令-tr
tr命令用于转换文本文件中的字符 [root@localhost test]# cat .txt abcdefg asdfoui asdfqer [root@localhost test]# cat ...
- WebMvcConfigurerAdapter
spring Boot 默认的处理方式就已经足够了,默认情况下Spring Boot 使用WebMvcAutoConfiguration中配置的各种属性. 建议使用Spring Boot 默认处理方式 ...