题解 P5006 【[yLOI2018] 大美江湖】
一道看似很困难,实际上只是纯模拟的“火”题
题目传送门
来吧,跟随我的脚步,带你A了这道题(当然,不要ctrl+c哦)!
STEP 1 提取主要条件
1.给你一幅图,各个字母的特殊功效如下其中如果遇到:
R:角色扣的血量 hp - 10(hp > = 0)
Q:角色的攻击力 st + 5
Y:角色的防御力 de + 5
M:角色将会扣血(公式如题)
2.已知每个敌人的属性( hp , st , de )以及角色的属性( x , y , hp , st , de )
3.有q个事件,分为两种事件类型:
第一种:查询( 即输出角色的 hp , st , de )
第二种:移动:1、2、3、4分别对应左右上下。 移动后,进行条件1的操作。
你,明白了吗?是不是so easy?!
STEP 2 AC代码及完整注释(超短的哦)
#include <bits/stdc++.h>//美丽的万能头
using namespace std;
#define maxn(a,b) ((a)>(b)?(a):(b))
//自己定义一个取最大值,这样可以支持浮点和整形相比较
int n,m,q,w;//分别储存地图的长和宽,时间的个数,以及一个用来暂存的变量
char ma[101][101];//储存地图
int dx[5]={0,0,0,-1,1};
int dy[5]={0,-1,1,0,0};//移动数组
struct node{
int hp,st,de;
}gw;//敌人的信息
struct node1{
int hp,st,de,x,y;
}js;//角色的信息
int main(){
scanf("%d %d",&n,&m);
for (int i=1;i<=n;i++) scanf("%s",ma[i]+1);
scanf("%d %d %d\n%d %d\n%d %d\n%d",&gw.hp,&gw.st,&gw.de,&js.x,&js.y,&js.st,&js.de,&q);
//正常输入
while (q--){
scanf("%d",&w);//输入事件类型
if (w==1) printf("%d %d %d\n",js.hp,js.st,js.de);//如果为1就打印角色属性
if (w==2){
scanf("%d",&w);//如果为2就移动
js.x+=dx[w];js.y+=dy[w];//移动对应的方向
if (ma[js.x][js.y]=='R') js.hp=maxn(js.hp-10,0);
if (ma[js.x][js.y]=='Q') js.st+=5;
if (ma[js.x][js.y]=='Y') js.de+=5;
int b1=ceil(double(gw.hp/maxn(1.0,js.st-gw.de)));
int b2=maxn(1,gw.st-js.de);//将算式的两部分分开来算不容易出错
if (ma[js.x][js.y]=='M') js.hp+=maxn(1,b1*b2);
//发生事件
}
}
return 0;//好习惯++
}
STEP 3 完结撒花!
看完本篇题解,你是否有些恍然大悟呢?如果还有不懂的地方,欢迎在评论区回复,我会第一时间回复哒!
如果已经明白了,就点个赞纪念一下你的成长吧!