UVALive 5066 Fire Drill BFS+背包
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
Description
Joko is taking part in a fire drill which is held by the Jakarta Fire Department to recruit new firemen. The drill is about rescuing volunteers (who act as unconscious people) trapped in a building in a limited time. The building has several floors, and the volunteers are scattered throughout the building. Each volunteer has points assigned to her. The fireman candidate should rescue volunteers through carrying them to the exit. The candidate will earn the assigned points for each volunteer he rescued.
Each floor of a building can be seen as a grid of cells. Each cell can be an obstacle, an empty space, a stair or an entry/exit point.
A candidate starts at the entry point which exists only at one single cell of the first floor of the building. The candidate can move to any adjacent non-obstacle cells (north, south, west or east) or climb up or down a stair in 1 second. The movement slows down to 2 seconds when the candidate carries a volunteer. When a candidate finds a volunteer, he may decide to rescue her or not, but if he decides to rescue her, he has to carry her back to the exit without stopping. He can only carry at most one volunteer at a time.
Joko has the floor plan of the test building. Help him plan his moves, so he can get the highest possible score.
Input
The first line of input contains an integer T(T
100) denoting the number of case. Each case has five integers L(1
L
10), H(1
H
100), W(1
W
100), N(1
N
100) and S(1
S
10, 000) denoting the number of floors, height and weight of each floor, the number of unconscious people, and the given time respectively.
The next L blocks describe the map of each floor from the 1st floor to the L-th floor respectively. Each floor consists of H lines each contains W characters. Characters that may appear in each floor are:
- ``S" : The starting point, also serves as the exit point. There will be only one starting/exit point and it will appear in the first floor.
- ``X" : Obstacle, cell that cannot be visited (wall, fire, etc.).
- ``U" : Stair that connect to the upper floor. There will be a ``D" character at the same place in the upper level. This character will not appear in the highest level of the building.
- ``D" : Stair that connect to the lower floor. There will be a ``U" character at the same place in the lower level. This character will not appear in the lowest level of the building.
- ``." : Empty space, cell that can be visited.
The next N lines each contains four integers fi(1
fi
L), ri(1
ri
H), ci(1
ci
W), pi(1
pi
1, 000)
denoting the location of each volunteer (floor, row, column) and the
point assigned to this volunteer respectively. You can assume that each
volunteer will be located in empty space and no two volunteer occupy the
same location.
Output
For each case, output in a line a single integer the highest point that
he can earn by rescuing unconscious people within the given time.
Sample Input
2
3 3 5 3 55
XXXXX
X..UX
XSXXX
XXXXX
XU.DX
XXXXX
XXXXX
XD..X
XXXXX
1 2 3 10
3 2 3 50
3 2 4 60
2 2 6 4 27
......
S..U..
......
...D..
1 2 3 20
1 2 5 50
1 2 6 50
2 1 1 90
Sample Output
110
100
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; struct node
{
int x,y,z,t;
};
const int d[][]= {{,,},{,,},{,-,},{,,-}};
char ss[][][];
int pp[][][];
int h,w,L;
int S,V[],p[],f[];
bool zg[][][];
char sss[];
node R[];
int ggg,gg;
bool check(int z,int x,int y)
{
if(x>-&&y>-&&z>-&&z<h&&x<w&&y<L)
return ;
return ;
}
void bfs (int xx,int yy,int zz,int tt)
{
int i;
int x3,y3,z3; if(ss[zz][xx][yy]=='P')
{
p[pp[zz][xx][yy]]=tt*;
}
if (ss[zz][xx][yy]=='U'&&zg[zz+][xx][yy]==)
{
zg[zz+][xx][yy]=;
R[ggg].x=xx;
R[ggg].y=yy;
R[ggg].z=zz+;
R[ggg++].t=tt+;
}
if (ss[zz][xx][yy]=='D'&&zg[zz-][xx][yy]==)
{
zg[zz-][xx][yy]=;
R[ggg].x=xx;
R[ggg].y=yy;
R[ggg].z=zz-;
R[ggg++].t=tt+;
}
for (i=;i<;i++)
{
x3=xx+d[i][];
y3=yy+d[i][];
z3=zz;
if (check(z3,x3,y3)&&ss[z3][x3][y3]!='X'&&zg[z3][x3][y3]==)
{
zg[z3][x3][y3]=;
R[ggg].x=x3;
R[ggg].y=y3;
R[ggg].z=z3;
R[ggg++].t=tt+;
}
}
++gg;
if (gg!=ggg) bfs(R[gg].x,R[gg].y,R[gg].z,R[gg].t);
} int main()
{
int T,N,x,y,z,i,j,t;
int ex,ey;
scanf("%d",&T);
while(T--)
{
ggg=;gg=-;
scanf("%d%d%d%d%d",&h,&w,&L,&N,&S);
for(i=;i<h;i++)
{
for(j=;j<w;j++)
{
scanf("%s",sss);
for(t=;t<L;t++)
{
zg[i][j][t]=;
ss[i][j][t]=sss[t];
if(sss[t]=='S')
{
ex=j,ey=t;
}
}
}
} for(int i=; i<N; i++)
{
scanf("%d%d%d%d",&z,&x,&y,&V[i]);
ss[z-][x-][y-]='P';
pp[z-][x-][y-]=i;
p[i]=S+;
}
zg[][ex][ey]=;
bfs(ex,ey,,);
//01背包
memset(f,,sizeof(f));
for(i=;i<N;i++)
{
for(j=S;j>=p[i];j--)
{
f[j]=max(f[j],f[j-p[i]]+V[i]);
}
}
printf("%d\n",f[S]);
}
return ;
}
UVALive 5066 Fire Drill BFS+背包的更多相关文章
- UVALive 5066 Fire Drill --BFS+DP
题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入 ...
- UVA 11624 - Fire! 图BFS
看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...
- UVa 11624 Fire!(BFS)
Fire! Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld & %llu Description Joe ...
- (简单) UVA 11624 Fire! ,BFS。
Description Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ow ...
- (FZU 2150) Fire Game (bfs)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2150 Problem Description Fat brother and Maze are playing ...
- FZU 2150 Fire Game (bfs+dfs)
Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board ...
- UVALive 4025 Color Squares(BFS)
题目链接:UVALive 4025 Color Squares 按题意要求放带有颜色的块,求达到w分的最少步数. //yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么 ...
- UVA - 11624 Fire! 【BFS】
题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...
- UVA - 11624 Fire! 双向BFS追击问题
Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ...
随机推荐
- shell脚本练习题->1
猜随机数的大小 描述: 写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入:并且提示用户输入的数字比预设数字大或者小 分析: 1:随机数字 ...
- centos7 部署镜像仓库 harbor
=============================================== 2018/4/16_第2次修改 ccb_warlock 更新 ...
- 目标板通过nfs挂载根文件系统
目标板挂载根文件系统的方法有两种(这里所说的服务端就是ubuntu,Ubuntu已经成功安装了nfs服务,并且保证服务端与目标板ping 通) 第一种:等待开发板启动之后去挂载,此时文件系统从Flas ...
- 数据库-mysql数据库和表操作
一:数据库查询增加删除 1)mysql数据库查询:show databases MariaDB [mysql]> show databases; +--------------------+ | ...
- (五)HttpClient 连接超时及读取超时
第一节: HttpClient 连接超时及读取超时 HttpClient连接超时及读取超时 httpClient在执行具体http请求时候 有一个连接的时间和读取内容的时间: HttpClient连接 ...
- PHP性能调优,PHP慢日志---善用php-fpm的慢执行日志slow log,分析php性能问题
众所周知,MySQL有slow query log,根据慢查询日志,我们可以知道那些sql语句有性能问题.作为mysql的好搭档,php也有这样的功能.如果你使用php-fpm来管理php的话,你可以 ...
- 动态页面技术JSP/EL/JSTL
本节内容: jsp脚本和注释 jsp运行原理 jsp指令(3个) jsp内置/隐式对象(9个) jsp标签(动作) EL技术 JSTL技术 JavaEE的开发模式 动态页面技术:就是在html中嵌入j ...
- Winfom 插件式(Plugins)/模块化开发框架-动态加载DLL窗体-Devexpress
插件式(AddIn)架构,不是一个新名词,应用程序采用插件式拼合,可以更好的支持扩展.很多著名的软件都采用了插件式的架构,如常见的IDE:Eclipse,Visual Studio,SharpDeve ...
- vue 笔记备份
Vue实现数据双向绑定的原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty() ...
- 【LOJ】#2674. 「NOI2012」美食节
题解 这道题的费用流如果朴素一点怎么建边呢 建出\(\sum_{i = 1}^{n} p^{i} M\)个点,第\(i\)个厨师的第\(j\)个点表示这个厨师倒数第\(j\)个做的是某道菜 这个点向汇 ...