`
java-mans
  • 浏览: 11710692 次
文章分类
社区版块
存档分类
最新评论

UVALive 5066 Fire Drill

 
阅读更多

Description

Download as PDF

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 integerT(T$ \le$100)denoting the number of case. Each case has five integersL(1$ \le$L$ \le$10),H(1$ \le$H$ \le$100),W(1$ \le$W$ \le$100),N(1$ \le$N$ \le$100)andS(1$ \le$S$ \le$10, 000)denoting the number of floors, height and weight of each floor, the number of unconscious people, and the given time respectively.

The nextLblocks describe the map of each floor from the 1st floor to theL-th floor respectively. Each floor consists ofHlines each containsWcharacters. 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 nextNlines each contains four integersfi(1$ \le$fi$ \le$L),ri(1$ \le$ri$ \le$H),ci(1$ \le$ci$ \le$W),pi(1$ \le$pi$ \le$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
题目描述:救人,这是一个三维的迷宫着火了,里面有若干人,时间一定,一次只能救一人,且从出发点到被救的人那里的时间是回来的时间的一半,救一个人获得P「i」的价值,问你最多能得到多少价值;

我想到的方法是从起点开始进行宽度优先遍历,把救每个人的最短时间求出来,然后再来次01背包就可以解决了。
LANGUAGE:C++
CODE:
#include<stdio.h>
#include<string.h>
#include<queue>
#define maxn 101
using namespace std;

struct node
{
    int x,y,z,step;
};

const int dir[4][3]= {{0,1,0},{0,0,1},{0,-1,0},{0,0,-1}};
char matrix[11][101][101];
int height,width,length;
int v,path[101],p[101],f[10001];

bool check(int x,int y,int z)
{
    if(x>-1&&y>-1&&z>-1&&x<height&&y<width&&z<length)
        return 1;
    return 0;
}
void bfs(int startx,int starty,int startz)
{
    queue <node>que;
    node cur,next;
    bool used[maxn][maxn][maxn]={{{0}}};
    int pcnt=0;
    int tx,ty,tz;

    cur.x=startx,cur.y=starty,cur.z=startz,cur.step=0;
    used[cur.x][cur.y][cur.z]=1;
    que.push(cur);

    while(!que.empty())
    {
        cur=que.front();que.pop();
        if(matrix[cur.x][cur.y][cur.z]=='&')
        {
            path[pcnt++]=cur.step;
        }
        if(matrix[cur.x][cur.y][cur.z]=='U')
        {
            tx=cur.x+1;
            if(tx<height&&matrix[tx][cur.y][cur.z]!='X'&&!used[tx][cur.y][cur.z])
            {
                next.x=tx,next.y=cur.y,next.z=cur.z,next.step=cur.step+1;
                used[next.x][next.y][next.z]=1;
                que.push(next);
            }
        }
        else if(matrix[cur.x][cur.y][cur.z]=='D')
        {
            tx=cur.x-1;
            if(tx>-1&&matrix[tx][ty][tz]!='X'&&!used[tx][cur.y][cur.z])
            {
                next.x=tx,next.y=cur.y,next.z=cur.z,next.step=cur.step+1;
                used[next.x][next.y][next.z]=1;
                que.push(next);
            }
        }
        for(int i=0;i<4;i++)
        {
            tx=cur.x+dir[i][0],ty=cur.y+dir[i][1],tz=cur.z+dir[i][2];
            if(check(tx,ty,tz)&&!used[tx][ty][tz]&&matrix[tx][ty][tz]!='X')
            {
                used[tx][ty][tz]=1;
                next.step=cur.step+1,next.x=tx,next.y=ty,next.z=tz;
                que.push(next);
            }
        }
    }
}
int main()
{
    freopen("in.txt","r",stdin);
    int tCase,volun,x,y,z;
    int sx,sy,sz;
    scanf("%d",&tCase);
    getchar();
    while(tCase--)
    {
        scanf("%d%d%d%d%d",&height,&width,&length,&volun,&v);
        getchar();
        for(int i=0; i<height; i++)
        {
            for(int j=0; j<width; j++)
            {
                for(int k=0; k<length; k++)
                {
                    scanf("%c",&matrix[i][j][k]);
                    if(matrix[i][j][k]=='S')
                    {
                        sx=i,sy=j,sz=k;
                    }
                }
                matrix[i][j][length]='\0';
                getchar();
            }
        }
        for(int i=0; i<volun; i++)
        {
            scanf("%d%d%d%d",&x,&y,&z,&p[i]);
            matrix[x-1][y-1][z-1]='&';
        }
        bfs(sx,sy,sz);
        memset(f,0,sizeof(f));
        for(int i=0;i<volun;i++)
        path[i]*=3;
        for(int i=0;i<volun;i++)
        {
            for(int j=v;j>=path[i];j--)
            {
                f[j]=max(f[j],f[j-path[i]]+p[i]);
            }
        }
        printf("%d\n",f[v]);
    }
    return 0;
}


分享到:
评论

相关推荐

    DiskDrill 1.8 含注册机,注册机1.6-1.8通用

    **DiskDrill 1.8 数据恢复软件详解** DiskDrill是一款强大的数据恢复工具,尤其在Mac操作系统中表现优秀。该软件的主要功能是帮助用户恢复意外丢失或删除的文件,无论是由于误操作、系统崩溃还是硬件故障导致的数据...

    使用Apache Drill技术

    ### 使用Apache Drill技术详解 #### 一、Apache Drill概述 **Apache Drill** 是一款用于大数据交互式分析的强大工具,属于开源分布式系统。它的主要特点包括: - **支持多种数据源和格式**:不仅可以处理传统的...

    apache_drill_tutorial.pdf

    Apache Drill 是一个开源的无模式SQL查询引擎,它在大数据分析领域扮演着重要的角色。与传统的Hive不同,Drill不依赖MapReduce作业,并且它并不完全基于Hadoop生态系统。实际上,Drill的设计灵感来源于Google的...

    disk drill 破解版, windowns 版

    disk drill 破解版, windowns 版。用于磁盘文件恢复,不限量

    Learning Apache Drill 2019.pdf

    《Learning Apache Drill 2019》是一本关于如何使用Apache Drill进行分布式数据源查询和分析的书籍。Apache Drill是一个开源的SQL查询引擎,它能够查询各种数据源,包括Hadoop上的数据、NoSQL数据库、云存储服务和...

    Learning Apache Drill

    Apache Drill是Google BigQuery团队发起的一个开源项目,它是一个分布式、低延迟的SQL查询引擎,设计用于处理大规模的非结构化和半结构化数据。Apache Drill的目标是提供一种简单、快速的方式来查询和分析大规模的...

    Altium输出gerber&Drill详细方法和步骤

    ### Altium输出Gerber & Drill 文件的详细方法与步骤 #### 一、Altium输出Gerber文件 在Altium Designer中输出Gerber文件是电路板制造的重要步骤之一,它能够确保设计者的设计意图准确无误地传递给制造商。以下是...

    Apache Drill技术手册

    Apache Drill 技术手册 Apache Drill 是一个低延迟的分布式海量数据交互式查询引擎,使用户能够使用 ANSI SQL 兼容语法查询多种类型的数据存储系统,包括本地文件、HDFS、Hive、HBase、MongoDB 等。Drill 的设计...

    disk drill文件恢复工具

    文件恢复工具,U盘恢复,硬盘恢复,文件恢复,disk drill破解版,免费

    disk_drill_Recuva.7z

    标题 "disk_drill_Recuva.7z" 暗示了这是一个包含两种文件恢复软件的压缩包,分别是 Disk Drill 和 Recuva。这两款工具都是为了帮助用户在误删除、格式化或其他数据丢失情况下找回重要文件。下面将详细介绍这两个...

    Cognos Drill Up/Down

    ### Cognos Drill Up/Down:深入理解与应用 #### 引言 在现代数据分析领域,Cognos作为一款领先的企业级商业智能工具,提供了强大的报告设计与数据分析功能。其中,“Drill Up/Down”(钻取)是Cognos中的一个核心...

    Apache Drill常用函数

    Apache Drill是一款强大的、跨平台的数据查询引擎,专为大数据分析设计。它支持SQL查询语言,使得用户能够方便地处理各种不同类型的数据源,如Hadoop、NoSQL数据库、云存储等。在Apache Drill 1.18版本中,我们找到...

    [Windows] 专业数据资料文件恢复软件Disk Drill Pro

    Disk Drill由多种数据恢复算法支持,可以读取NTFS, FAT32, EXT, HFS+和其他的文件系统。恢复在你系统硬盘和外部设备、SD卡和U盘、其他的笔记本电脑和计算机上由于误删除而丢失的数据。 快速而且简单全面的数据恢复,...

    Disk Drill Pro v4.0.5271.rar

    标题中的"Disk Drill Pro v4.0.5271.rar"表明这是一款名为Disk Drill Pro的数据恢复软件的版本号为4.0.5271的压缩包文件。Disk Drill是一款广泛使用的数据恢复工具,它能帮助用户找回丢失、删除或格式化的文件,尤其...

    echarts3-chinese-map-drill-down.zip

    在“echarts3-chinese-map-drill-down.zip”这个压缩包中,我们聚焦的是ECharts的一个特色功能——省市区/县地图的三级下钻功能。这个功能允许用户在地图上进行多级深度交互,从全国地图逐级细化到省级、市级直至区...

    diskdrill3.7.dmg

    disk drill mac版来帮您!这款苹果数据恢复软件提供磁盘监控、Mac清理、恢复驱动器、数据保护、数据备份等实用功能,支持快速扫描和深度扫描,所有丢失的数据都可以帮你找回,是找回你心爱数据的得力帮手!

    Protel中输出Gerber File及Drill File的方法

    在电子制造过程中,Gerber File和Drill File是至关重要的文件类型,它们分别用于描述电路板的印刷电路层和钻孔信息。下面将详细介绍如何在Protel中输出这两种文件。 1. 输出Gerber File: Gerber File是PCB制造的...

    2013大数据技术大会drill介绍

    在2013年的大数据技术大会上,Drill的介绍提供了关于该大数据查询工具的重要信息,这些信息对于大数据分析师来说是非常宝贵的入门材料。Drill作为一个开源的分布式SQL查询引擎,旨在对Hadoop、NoSQL和云存储服务等大...

    drill-jdbc-all-1.16.0.jar

    Apache Drill 1.16.0驱动包用maven shaded重新打包,包名统一加上了shaded.xxx,drill-jdbc-all-1.16.0 shaded,和系统其他jar不会冲突

    Mac os data recovery Disk Drill

    mac os 恢复 recovery Disk Drill pro

Global site tag (gtag.js) - Google Analytics