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玩魔塔
传送门 其实就是板子--只要会克鲁斯卡尔重构树和带修莫队就可以了 这么想着的我就调了将近一个下午-- 思路其实比较清晰,然而码量很大,细节贼多-- 不难看出只在最小生成树上走最优,于是建出克鲁斯卡尔重 ...
随机推荐
- Bzoj2118 墨墨的等式
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1488 Solved: 578 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+ ...
- glibc resolv/res_send.c getaddrinfo() buffer stack smash when dealing malformation big DNS Response Package
catalogue . 漏洞简述 . 调试环境搭建 . 漏洞利用 . 漏洞分析 . 缓解修复方案 1. 漏洞简述 0x1: 函数调用顺序 getaddrinfo (getaddrinfo.c) -&g ...
- pycharm安装python模块
这个工具真的好好,真的很喜欢,它很方便,很漂亮,各种好 pycharm安装python模块:file-setting-搜索project inte OK
- Error=Bias+Variance
首先 Error = Bias + Variance Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输 ...
- BZOJ3697: 采药人的路径
传送门 不是那么裸的点分治. $f[i][0/1]$表示当前节点的一个子树中总权值和为$i$,且是否存在一个前缀使得其前缀和为$i$ $g[i][0/1]$表示当前节点的已遍历过的子树,其余一样. 对 ...
- ASP.NET程序单客户端(浏览器)登录的实现方案
需求描述:当用户的账户在另一个浏览器中登录的时候,需要把当前浏览器的登录强制下线.这种需求在业务系统,或付费视频服务网站中比较常见. 这种需求我称之为"单客户端(浏览器)"登录,与 ...
- select()
select(),确定一个或多个套接口的状态,本函数用于确定一个或多个套接口的状态,对每一个套接口,调用者可查询它的可读性.可写性及错误状态信息,用fd_set结构来表示一组等待检查的套接口,在调用返 ...
- Bootstrap基本类和组件学习二
一.联系方式:(自带鼠标的移动动画) 1.头文件CSS <link rel="shortcut icon" href="favicon.ico"> ...
- vim 显示颜色脚本
vim 显示颜色脚本 echo TERM=xterm >>/root/.bash_profile echo export TERM >>/root/.bash_profile ...
- hdu 1873 看病要排队(优先级队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题目大意: 三个医生看病,病人排队看病,病人有优先级,优先级高的提前看病,同样的优先级按先后.I ...