洛谷P5006题解

本文同步更新于洛谷博客

题目描述

你在一张地图上移动,用 \(1/2/3/4\) 来表示左/右/上/下,当前格子上的字母代表着你要进行相应的操作。

R\(HP\gets\max(0,HP-10)\)
Q\(ST\gets ST+5\)
Y\(DE\gets DE+5\)
M\(HP\gets HP+\max(1,\left\lceil\dfrac{HP_0}{\max(1,ST-DE_0)}\right\rceil\times\max(1,ST_0-DE))\)
(具体题意还是建议看原题)

题解

我们可以将角色和怪物的属性用结构体存起来,然后记录下角色的位置,每次进行相应的操作即可。

注意

  • 上文中的 \(\gets\) 为赋值符号。
  • 使用函数 ceil 最好转成 double 类型再使用。
  • 对于这种阅读理解题一定要先读清题意和题目要求才去打代码。

Code

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int hp,st,de;
}a,b;
int n,m,t,x,y,op,d,p,q;
int dx[]={0,0,0,-1,1},dy[]={0,-1,1,0,0};
char s[105][105];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    scanf("\n%s",s[i]+1);
    scanf("%d%d%d%d%d%d%d%d",&a.hp,&a.st,&a.de,&x,&y,&b.st,&b.de,&t);
    while(t--)
    {
	scanf("%d",&op);
	if(op&1)
	    printf("%d %d %d\n",b.hp,b.st,b.de);
	else
	{
	    scanf("%d",&d);
	    x+=dx[d],y+=dy[d];
	    if(s[x][y]=='R')
		b.hp=max(0,b.hp-10);
	    else if(s[x][y]=='Q')
		b.st+=5;
	    else if(s[x][y]=='Y')
		b.de+=5;
	    else if(s[x][y]=='M')
	    {
		p=ceil(double(a.hp/max(1.0,double(b.st-a.de))));
		q=max(1,a.st-b.de);
		b.hp+=max(1,p*q);
	    }
	}
    }
    return 0;
}
posted @ 2022-03-15 19:29  Ginger_he  阅读(44)  评论(0)    收藏  举报