CCF201609-3 炉石传说(模拟)

传送门:CCF201609-3 炉石传说

很暴力的模拟题。就按照题目要求一顿瞎几把模拟就好了。

唯一要注意的点就是,如果一方攻击对方的英雄,并且导致英雄死亡,如果不加处理,会导致越界,即随从本来只能在1-7位,越界到0位英雄位上了。博主就因为疏忽了这个,第一发只拿了70分。

下面是AC代码:

#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
struct Minion
{
    int ak, hp;
    Minion() {}
    Minion(int AK, int HP): ak(AK), hp(HP) {}
}f[2][8];

void init()
{
    for(int i = 0; i < 2; ++i)
    {
        f[i][0] = Minion(0, 30);
        for(int j = 1; j <= 7; ++j)
            f[i][j] = Minion(0, 0);
    }
}

void dead(int turn, int pos)
{
    if(!pos) //防止越界,很重要,没有这条语句只有70分
        return;
    f[turn][pos] = Minion(0, 0);
    for(int i = pos; i < 7; ++i)
        f[turn][i] = f[turn][i+1];
    f[turn][7] = Minion(0, 0);
}

void read()
{
    int T;
    cin >> T;
    int turn = 0;
    while(T--)
    {
        string action;
        cin >> action;
        if(action == "summon")
        {
            int pos, ak, hp;
            cin >> pos >> ak >> hp;
            if(f[turn][pos].hp)
                for(int i = 7; i > pos; --i)
                    f[turn][i] = f[turn][i-1];
            f[turn][pos] = Minion(ak, hp);
        }
        else if(action == "attack")
        {
            int atk, dfd;
            cin >> atk >> dfd;
            f[turn][atk].hp -= f[!turn][dfd].ak;
            f[!turn][dfd].hp -= f[turn][atk].ak;
            if(f[turn][atk].hp <= 0)
                dead(turn, atk);
            if(f[!turn][dfd].hp <= 0)
                dead(!turn, dfd);
        }
        else if(action == "end")
            turn = !turn;
    }
}

void solve()
{
    int winner = 0;
    if(f[0][0].hp <= 0)
        winner = -1;
    if(f[1][0].hp <= 0)
        winner = 1;
    cout << winner << '\n';

    for(int i = 0; i < 2; ++i)
    {
        cout << f[i][0].hp << '\n';
        int cnt = 0;
        vector <int> ans;
        for(int j = 1; j <= 7; ++j)
            if(f[i][j].hp > 0)
            {
                cnt++;
                ans.push_back(f[i][j].hp);
            }
        cout << cnt;
        for(int j = 0; j < ans.size(); ++j)
            cout << ' ' << ans[j];
        cout << '\n';
    }
}

int main()
{
    init();
    read();
    solve();
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值