描述

百度noip贴吧管理组开发了一个小游戏,叫魔塔魔塔。虽然把魔塔重复了两次,但其实还只是个魔塔而已,还是简化版的。游戏在一个N*M大小的地图中进行,每一格都是正方形。
对于某一格,有若干种可能的状态:
1)空格,用“.”表示。人畜无害。
2)陷阱,用“D”表示。踩一次会掉一些血,踩R次就会死亡。
3)墙,用“#”表示。不能踩上这样的格子。
4)宝物,用P表示。表示格子里有宝物,每个宝物都有一定的价值。同时宝物需要一些钥匙去开启,有三种不同的钥匙:红色、蓝色、绿色,每一个宝箱都需要最多三把钥匙打开。
5)出生点,用“S”表示。

现在你扮演着游戏中的勇者,正准备出发去购买宝物。一开始你有一些钱Q,你可以用这些钱向神秘商人Nettle购买一些红色、蓝色、绿色钥匙,价格分别是R,B,G。当你购买了钥匙后,就可以进入地图探险了,与此同时神秘商人Nettle就会离开,也就是说一旦进入地图,你就不能再购买钥匙了。一开始你在出生点,其中当你身上没有宝物时,你可以以1秒的时间从某个向上、下、左、右四个方向移动一格。当你遇到一个宝物,你可以选择拾起或不拾起(不浪费时间),但是一旦拾起就必须将其搬回游戏出生点,并且每步需要耗费3秒的时间。
这个游戏有时间限制K秒。请你计算出在K秒内能获得的最大价钱。注意你一开始的金钱没有使用的部分也计算在内。

输入格式

输入第一行是五个数N,M,K,Q,R,表示地图的大小、时间限制、金钱数量和陷阱最多能踩的次数。(1<=N,M<=20,0<=K<=800,0<=Q<=100,0<=R<=10)
之后是一个N*M的字符矩阵,表示地图上面的物品数量。
之后是一行三个数R,B,G,表示红色、蓝色、绿色钥匙的价格。(1<=R,B,G<=100)
之后是若干行(直至文件末尾EOF,你可以使用while(scanf()!=EOF)或者while not seekeof(input)读入),每行有六个数X,Y,A,B,C,V,表示在(x,y)处的宝箱需要A把红色钥匙B把蓝色钥匙C把绿色钥匙打开,价格为V。(0<=V<=5000,0<=A+B+C<=3)
保证读入合法,并且只有一个S。

输出格式

输出只有一行,表示最多能获得的宝物价格。

测试样例1

输入

5 5 10 100 1 
##### 
#P#P# 
#.#D# 
#...# 
##S## 
50 50 1 
2 2 1 1 1 100 
2 4 0 0 0 5000

输出

100

/*
bfs预处理,加一个背包dp,处理比较暴力,90分
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
using namespace std;
struct dat{
int y;
int x;
int bl;
int stp;
};
struct ITM{
int x;
int y;
int r;
int b;
int g;
int v;
}itm[];
int ans;
int n,m,k,q,r,p_r,p_b,p_g;
int am_p,am_t,sx,sy;
int d[][][];
int dp[][][];
int dx[] = {,,-,};
int dy[] = {,-,,};
vector<int> mb[][];
bool vis[][][];
char mp[][];
inline bool judge(int y,int x){
if(y > n||y < ||x > m||x < ||mp[y][x]=='#') return false;
else return true;
}
inline int get_p(int t_r,int t_b,int t_g){
return t_r*p_r + t_b*p_b + t_g*p_g;
}
int read(){
int x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
void input(){
n = read();
m = read();
k = read();
q = read();
r = read();
for(int i = ;i <= n;i++) scanf("%s",mp[i]+);
fo(i,,n){
fo(j,,m){
if(mp[i][j] == 'S') sy = i,sx = j;
}
}
p_r = read();
p_b = read();
p_g = read();
int X,Y,A,B,C,V;
while(scanf("%d%d%d%d%d%d",&X,&Y,&A,&B,&C,&V)!=EOF){
am_p++;
itm[am_p].y = X;
itm[am_p].x = Y;
itm[am_p].r = A;
itm[am_p].b = B;
itm[am_p].g = C;
itm[am_p].v = V;
}
}
void bfs(){
dat now,to;
queue<dat> q;
now.y = sy;
now.x = sx;
now.bl = ;
now.stp = ;
q.push(now);
vis[now.y][now.x][now.bl] = true;
while(!q.empty()){
now = q.front();
q.pop();
fo(k,,){
to.y = now.y + dy[k];
to.x = now.x + dx[k];
if(!judge(to.y,to.x)) continue;
to.bl = now.bl;
to.stp = now.stp+;
if(mp[to.y][to.x] == 'D') to.bl++;
if(to.bl > r) continue;
if(!vis[to.y][to.x][to.bl]){
vis[to.y][to.x][to.bl] = true;
d[to.y][to.x][to.bl] = to.stp;
mb[to.y][to.x].push_back(to.bl);
q.push(to);
}
}
}
}
void get_ans(){
int ny,nx,np,cta,ctb,ctm,get_m;
fo(bx,,am_p){
ny = itm[bx].y;
nx = itm[bx].x;
get_m = itm[bx].v;
if(!mb[ny][nx].size()) continue;
fd(sj,,k){
fd(jq,,q){
np = get_p(itm[bx].r,itm[bx].b,itm[bx].g);
if(jq < np) break;
fd(xl,,r){
fo(sxl,,mb[ny][nx].size()-){
fo(sxh,,mb[ny][nx].size()-){
cta = mb[ny][nx][sxl];
ctb = mb[ny][nx][sxh];
ctm = d[ny][nx][cta] + *d[ny][nx][ctb];
if(xl < cta + ctb) continue;
if(sj < ctm) continue;
dp[sj][jq][xl] = max(dp[sj][jq][xl],dp[sj-ctm][jq-np][xl-cta-ctb] + get_m - np);
ans = max(dp[sj][jq][xl],ans); }
}
}
}
}
}
cout<<ans + q;
}
int main(){
input();
bfs();
get_ans();
return ;
}

tyvj1614 魔塔魔塔!的更多相关文章

  1. cocos2dx 魔塔项目总结(一)

    <魔塔天城>发布已经有半年的时间了,一直想找时间来总结一下这个项目,但总是一拖再拖.如果再这么拖下去,就永远都不会有时间来写这个总结了,时间总是挤出来的. 魔塔天城使用的cocos2dx ...

  2. 2018-2019学年第一学期Java课设--魔塔

    目录 Magic-Towers 一.团队名称.团队成员介绍.任务分配 团队名称:MoTa 团队成员介绍 任务分配 二.项目简介 三.项目采用技术 四.项目亮点 主界面显示主要信息功能 游戏动画 五.项 ...

  3. 自己做的roguelike+恶魔城游戏《魔塔猎人》已发布。

    游戏仍然是标准的roguelike,死亡后回到出生点重新开始,宏观架构上参考了<死亡细胞>,战斗设计上更加强调轻重攻击的组合,再配合236和28系列的搓招技.空中的突进飞腿.副武器等等. ...

  4. 魔兽争霸war3心得体会(四):不死族vs人族1本火魔塔

    QQ对战平台上玩随机的人特别多,为了应对对方的"出其不意",我最近一直用小狗去探路,小狗在家采集30个木头-摆放商店,就可以去探路了.主要有几个好处:知道对方的种族-出生点位-开局 ...

  5. P5168 xtq玩魔塔 [克鲁斯卡尔重构树+带修莫队]

    P5168 xtq玩魔塔 又是码农题- 利用克鲁斯卡尔重构树的性质 我们就可以得出 \(dep\) 值小的,肯定比 \(dep\) 大的值要优. 于是第二问就可以直接 LCA 求出来了- 至于第三问, ...

  6. 【Luogu P5168】xtq玩魔塔(Kruskal 重构树 & 树状数组 & set)

    Description 给定一个 \(n\) 个顶点,\(m\) 条边的无向联通图,点.边带权. 先有 \(q\) 次修改或询问,每个指令形如 \(\text{opt}\ x\ y\): \(\tex ...

  7. Luogu P5168 xtq玩魔塔

    这题不错啊,结合了一些不太传统的姿势. 首先看到题目有一问从一个点到另一个点边权最小值.想到了什么? 克鲁斯卡尔生成树+倍增?好吧其实有一个更常用NB的算法叫克鲁斯卡尔重构树 (不会的可以看dalao ...

  8. BZOJ2130 : 魔塔

    考虑从$0$到$n$枚举$A$的通关楼层. 设$f[i]$表示$B$通关$i$层时$C$最多能得到多少金币,因为金币数非负,所以也可以看作最多通关多少层. 当$A$的通关楼层往上多$1$的时候,这把钥 ...

  9. P5168 xtq玩魔塔

    传送门 其实就是板子--只要会克鲁斯卡尔重构树和带修莫队就可以了 这么想着的我就调了将近一个下午-- 思路其实比较清晰,然而码量很大,细节贼多-- 不难看出只在最小生成树上走最优,于是建出克鲁斯卡尔重 ...

随机推荐

  1. CVE-2015-1328 Ubuntu 12.04, 14.04, 14.10, 15.04 overlayfs Local Root

    catalog . 引言 . Description . Effected Scope . Exploit Analysis . Principle Of Vulnerability . Patch ...

  2. 使用enum建立简单的状态机

    Overview The enum in Java is more powerful than many other languages which can lead to surprising us ...

  3. Algorithmic Graph Drawing in TikZ

    最近在写模板时需要画个图 ("图论"的"图"). 本来打算用Windows画图 (mspaint) 的, 但是效果不好, 还是决定用LaTeX的TikZ画. 这 ...

  4. Python编码格式的指定方式

    参考自: http://python.jobbole.com/85852/, 原文探究的更深,有兴趣的可以去看看. 简介来讲就是使用一种特殊的注释来声明编码格式,如何判断这种格式也用了很简单粗暴有效的 ...

  5. linux中权限的修改

    修改访问权限的linux名是:Linux访问权限的问题是这样子的:比如 d rwx rwx rwx ,d是文件所在的文件,后面有9位,分别代表不同者的权限.第一个rwx代表这文件的所有者的权限,r是r ...

  6. 远程连接实验室的VPN

    Windows 7 (win8类似)的用户请按以下步骤进行操作:1.点击“开始”菜单,然后点击“控制面板”,然后点击“查看网络和任务”.2.点击“设置新连接或网络”.3.点击“连接到工作区”,然后点击 ...

  7. linux系统判断是否重启、关机、查询登录诊断分析简介

    Last reboot这个命令是查看每次系统重启的信息 [root@dg01 log]# last rebootreboot system boot 2.6.32-300.10.1. Thu May  ...

  8. Bois设置教程

    BIOS设置图解教程之Award篇 (目前主板上常见的BIOS主要为AMI与AWARD两个系列,如何辨别BIOS品牌系列请移步,本文详细讲解Award系列的BIOS设置图解教程,如果你的BIOS为AM ...

  9. 爬虫4 html输出器 html_outputer.py

    #coding:utf8 __author__ = 'wang' class HtmlOutputer(object): def __init__(self): self.datas = []; de ...

  10. 入门:HTML:hello world!

    <html> <head> </head> <body> <h1>hello world!</h1> </body> ...