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;
}

猜你喜欢

转载自blog.csdn.net/qq_51800570/article/details/129208905