1 条题解
-
0
自动搬运
来自洛谷,原作者为

翼德天尊
2019-09-26 ~ 2024-03-03搬运于
2025-08-24 22:06:06,当前版本为作者最后更新于2020-04-04 12:58:45,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
一道看似很困难,实际上只是纯模拟的“火”题
来吧,跟随我的脚步,带你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 完结撒花!
看完本篇题解,你是否有些恍然大悟呢?如果还有不懂的地方,欢迎在评论区回复,我会第一时间回复哒!
如果已经明白了,就点个赞纪念一下你的成长吧!
- 1
信息
- ID
- 3971
- 时间
- 1000ms
- 内存
- 500MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者