题目
题目大意
本题给出了炉石传说这个游戏的部分规则,主要是说场上有两名玩家,每位玩家由一张英雄卡和七张角色卡位。初始时英雄有30点生命和0点攻击,由先手开始,每个回合可以执行若干次以下三种操作:
- 召唤随从:玩家召唤一个随从进入战场,随从具有指定的生命值和攻击力。
- 随从攻击:玩家控制自己的某个随从攻击对手的英雄或者某个随从。
- 结束回合:玩家声明自己的当前回合结束,游戏将进入对手的回合。该操作一定是一个回合的最后一个操作。
随从攻击时攻击者和被攻击者均受到对方攻击力点数的伤害。当场上任一方英雄生命值小于等于零时(生命值可为负),此时不再进行其余操作,游戏结束。现在要求输出最终游戏结果,同时给出两位英雄剩余生命值和各自剩余随从数及其生命值。
注意随从死亡和插入随从均需要保证随从编号从1~n连续,这也是本题要处理的一个关键点。
解题思路
本题是一道模拟体,总体难度不大,但是需要用到vector中的内容,便于实现战斗过程中的复杂操作。如果不使用vector自带的操作,很有可能会出现许多小问题,且代码复杂。之前第一次尝试时就是因为代码太过复杂导致查错困难,卡在了90分,使用vector对于这种复杂模拟就比较有优势。
本题读懂题后可以发现题意其实很简单,只要记录每个人当前所有手牌的攻击力和生命值状态,再按要求进行相应的攻击操作。如果随从被击败就直接替换下,将他后面的随从编号依次向前移动。最终观察哪一方英雄生命值小于等于零,则对方自然就是胜者。这里需要注意的是插入随从和删除随从,vector自带的insert和erase函数可以完成。
综上所述,本题关键是要理解题意,读懂题目,随后用简洁明了的代码实现,代码过于冗长也会造成不必要的麻烦。
具体代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include<functional>
#define ll long long
#define MAXN 30005
#define inf 1e9
using namespace std;
struct node{
int health;
int attack;
node(int h, int a) : health(h), attack(a) {}
};
vector<node> follow[2];
int main()
{
int n,a,b,c;
string op;
cin >> n;
int flag = 0;
follow[0].push_back(node(30,0));
follow[1].push_back(node(30,0));
while(n--)
{
cin >> op;
if(op == "summon")
{
cin >> a >> b >> c;
follow[flag].insert(follow[flag].begin()+a,node(c,b));
}
else if(op == "attack")
{
cin >> a >> b;
follow[flag][a].health -= follow[!flag][b].attack;
follow[!flag][b].health -= follow[flag][a].attack;
if(follow[flag][a].health <= 0 && a != 0)
{
follow[flag].erase(follow[flag].begin()+a);
}
if(follow[!flag][b].health <= 0 && b != 0)
{
follow[!flag].erase(follow[!flag].begin()+b);
}
}
else if(op == "end")
{
flag = !flag;
}
}
if(follow[0][0].health > 0 && follow[1][0].health > 0)
{
cout << 0 << endl;
}
else if(follow[0][0].health > 0)
{
cout << 1 << endl;
}
else if(follow[1][0].health > 0)
{
cout << -1 << endl;
}
cout << follow[0][0].health << endl;
cout << follow[0].size()-1 << " ";
for(int i = 1; i < follow[0].size(); i++)
{
cout << follow[0][i].health << " ";
}
cout << endl;
cout << follow[1][0].health << endl;
cout << follow[1].size()-1 << " ";
for(int i = 1; i < follow[1].size(); i++)
{
cout << follow[1][i].health << " ";
}
cout << endl;
return 0;
}