tyvj1614 魔塔魔塔!
描述
对于某一格,有若干种可能的状态:
1)空格,用“.”表示。人畜无害。
2)陷阱,用“D”表示。踩一次会掉一些血,踩R次就会死亡。
3)墙,用“#”表示。不能踩上这样的格子。
4)宝物,用P表示。表示格子里有宝物,每个宝物都有一定的价值。同时宝物需要一些钥匙去开启,有三种不同的钥匙:红色、蓝色、绿色,每一个宝箱都需要最多三把钥匙打开。
5)出生点,用“S”表示。
现在你扮演着游戏中的勇者,正准备出发去购买宝物。一开始你有一些钱Q,你可以用这些钱向神秘商人Nettle购买一些红色、蓝色、绿色钥匙,价格分别是R,B,G。当你购买了钥匙后,就可以进入地图探险了,与此同时神秘商人Nettle就会离开,也就是说一旦进入地图,你就不能再购买钥匙了。一开始你在出生点,其中当你身上没有宝物时,你可以以1秒的时间从某个向上、下、左、右四个方向移动一格。当你遇到一个宝物,你可以选择拾起或不拾起(不浪费时间),但是一旦拾起就必须将其搬回游戏出生点,并且每步需要耗费3秒的时间。
这个游戏有时间限制K秒。请你计算出在K秒内能获得的最大价钱。注意你一开始的金钱没有使用的部分也计算在内。
输入格式
之后是一个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 魔塔魔塔!的更多相关文章
- cocos2dx 魔塔项目总结(一)
<魔塔天城>发布已经有半年的时间了,一直想找时间来总结一下这个项目,但总是一拖再拖.如果再这么拖下去,就永远都不会有时间来写这个总结了,时间总是挤出来的. 魔塔天城使用的cocos2dx ...
- 2018-2019学年第一学期Java课设--魔塔
目录 Magic-Towers 一.团队名称.团队成员介绍.任务分配 团队名称:MoTa 团队成员介绍 任务分配 二.项目简介 三.项目采用技术 四.项目亮点 主界面显示主要信息功能 游戏动画 五.项 ...
- 自己做的roguelike+恶魔城游戏《魔塔猎人》已发布。
游戏仍然是标准的roguelike,死亡后回到出生点重新开始,宏观架构上参考了<死亡细胞>,战斗设计上更加强调轻重攻击的组合,再配合236和28系列的搓招技.空中的突进飞腿.副武器等等. ...
- 魔兽争霸war3心得体会(四):不死族vs人族1本火魔塔
QQ对战平台上玩随机的人特别多,为了应对对方的"出其不意",我最近一直用小狗去探路,小狗在家采集30个木头-摆放商店,就可以去探路了.主要有几个好处:知道对方的种族-出生点位-开局 ...
- P5168 xtq玩魔塔 [克鲁斯卡尔重构树+带修莫队]
P5168 xtq玩魔塔 又是码农题- 利用克鲁斯卡尔重构树的性质 我们就可以得出 \(dep\) 值小的,肯定比 \(dep\) 大的值要优. 于是第二问就可以直接 LCA 求出来了- 至于第三问, ...
- 【Luogu P5168】xtq玩魔塔(Kruskal 重构树 & 树状数组 & set)
Description 给定一个 \(n\) 个顶点,\(m\) 条边的无向联通图,点.边带权. 先有 \(q\) 次修改或询问,每个指令形如 \(\text{opt}\ x\ y\): \(\tex ...
- Luogu P5168 xtq玩魔塔
这题不错啊,结合了一些不太传统的姿势. 首先看到题目有一问从一个点到另一个点边权最小值.想到了什么? 克鲁斯卡尔生成树+倍增?好吧其实有一个更常用NB的算法叫克鲁斯卡尔重构树 (不会的可以看dalao ...
- BZOJ2130 : 魔塔
考虑从$0$到$n$枚举$A$的通关楼层. 设$f[i]$表示$B$通关$i$层时$C$最多能得到多少金币,因为金币数非负,所以也可以看作最多通关多少层. 当$A$的通关楼层往上多$1$的时候,这把钥 ...
- P5168 xtq玩魔塔
传送门 其实就是板子--只要会克鲁斯卡尔重构树和带修莫队就可以了 这么想着的我就调了将近一个下午-- 思路其实比较清晰,然而码量很大,细节贼多-- 不难看出只在最小生成树上走最优,于是建出克鲁斯卡尔重 ...
随机推荐
- StringBuilder类与String类的区别
String对象是不可改变的,每次使用String类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的String对象相关的 ...
- [iOS UI设计笔记整理汇总]
8.UIsearchbar放到Navigationbar 上(意思是建个View作为titleview) //此处调用的是第三方封装的SearchBar,也可以自定义. self.searchBarW ...
- POJ1025 Department
POJ1025 是一道模拟题. 这题第一个障碍是现在少见的循环电梯 ('pater-noster' elevator) ”The building has `pater-noster' elevato ...
- ejb 远程调用
1,客户端代码: package com.example.test; import java.util.Hashtable; import java.util.Properties; import j ...
- IOS基础之 (设计模式)
一 工厂方法 工厂方法方便我们快速创建类的实例的方法.通过工厂方法,可以让调用过程更加清晰. Person.h #import <Foundation/Foundation.h> @int ...
- Centos7下搭建KVM虚拟机
PRE-INSTALL ============================================================= kvm相关安装包及其作用 qemu-kvm 主要的K ...
- 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)
http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...
- CSS3定位和浮动详解
本文为大家分享CSS3定位和浮动的基础概念,与使用方法,供大家参考,具体内容如下 一.定位 1. css定位: 改变元素在页面上的位置 2. css定位机制: 普通流: 浮动: 绝对布局: 3. cs ...
- java 类的静态变量
主要是记录一个奇葩的现象,java类中的静态变量,不仅可以通过类名称直接调用,而且还可以通过类的实力对象调用,java是不存在静态类的,如果非要用静态的类那就是内部类. 类中的静态变量是存储在JVM方 ...
- hdu 4006 The kth great number(优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006 题目大意: 第一行 输入 n k,后有 n 行,对于每一行有两种状态 ,①“I x” : 插入 ...