CCF 炉石传说 满分代码(详细注释) + 解题思路 (结构体模拟) 201609-3

题目描述

在这里插入图片描述

解题思路

将每个人用结构体存储生命和攻击力
用一个结构体二维数组存储所有人员信息
p[0,0]存储先手英雄,p[0,1~7]存储先手的随从
p[1,0]存储先手英雄,p[1,1~7]存储先手的随从

读入n个操作,执行这n个操作,最后输出所有人员的生命信息

sommon操作,将pos位置后面的人右移,然后将新随从插入到pos位置
attack操作,将双方生命减去对方的攻击值,如果死了并且不是英雄的话,将后面的随从往前移动一位
如果是end操作,交换双方操作对象(r = !r)


代码实现

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <stack>

using namespace std;

struct people
{
    int a;
    int h;
}p[2][8]; //0为先手

void lmove(int i, int pos) //将随从左移
{
    for (int j = pos; j < 7; j ++) p[i][j] = p[i][j + 1];
    p[i][7] = {0, 0}; //最后一个空位进行清空
}

void print(int m) //输出
{
    cout << p[m][0].h << endl; //输出英雄生命
    
    int cnt = 0;
    for (int i = 1; i <= 7; i ++)
    {
        if (p[m][i].h > 0) cnt ++;
        else break;
    }
    cout << cnt;//输出存活的随从个数
    
    for (int i = 1; i <= cnt; i ++) cout << " " << p[m][i].h;
    cout << endl;
}

int main()
{
    int n;
    cin >> n;

    //初始化
    p[0][0] = {0, 30};
    p[1][0] = {0, 30};

    int r = 0; //定义先手为0,对手为!r
    while (n --)
    {
        string op;
        cin >> op;

        if (op == "summon") //召唤随从
        {
            int pos, atk, heal;
            cin >> pos >> atk >> heal;
            
            for (int j = 7; j > pos; j --) p[r][j] = p[r][j - 1]; //右移
            p[r][pos] = {atk, heal}; //插入新增的随从
        }
        else if (op == "attack") //攻击
        {
            int atker, defender;
            cin >> atker >> defender;
            
            //攻击方和被攻击方会同时对彼此造成等同于自己攻击力的伤害
            p[r][atker].h -= p[!r][defender].a;
            p[!r][defender].h -= p[r][atker].a;
            
            //如果任一方(不是英雄的情况下)死了,将后面的随从左移
            if (p[r][atker].h <= 0) lmove(r, atker);
            if (defender != 0 && p[!r][defender].h <= 0) lmove(!r, defender);
        }
        else
        {
            r = !r; //交换操作方
        }
    }

    if (p[0][0].h <= 0) cout << -1 << endl; //先手死了
    else if (p[1][0].h <= 0) cout << 1 << endl; //对手死了
    else cout << 0 << endl; //两个都没死

    //输出双方人员情况
    print(0);
    print(1);

    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只可爱的小猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值