炉石传说
程序员文章站
2022-07-12 20:53:14
...
炉石传说
题目描述
输入输出格式以及样例
思路
本题总的来说比较简单,使用数组保存随从以及英雄的状态,放随从的时候就插入,攻击的时候就修改两边随从的状态,如果随从死亡就删除随从,最后输出就行,数据帮助我们避免了特殊情况,比如双方英雄都死亡的情况,不会出现英雄死亡了还在攻击,所以不必考虑,最终谁死了另一方就是赢家。
由于本题随时都可能修改随从数组的值,我们使用动态数组vector描述随从列表,而且随从是从1开始的,所以我们将英雄状态保存在0号位置就行了。
代码
#include <iostream>
#include <vector>
using namespace std;
struct person{
int ad, hp;
person(int a, int h){ad = a;hp = h; }
};
vector<person> test[2];
int main() {
int n;cin >> n;
test[0].push_back(person(0, 30));//由于随从序号从1开始,0号位置放英雄
test[1].push_back(person(0, 30));
int n_p = 0;//当前回合的操作者序号
while(n--) {//游戏开始
string s; cin >> s;
if (s == "summon") {
int p, a, h;
cin >> p >> a >> h;
test[n_p].insert(test[n_p].begin() + p, person(a, h));
}
else if (s == "attack") {
int a, d;
cin >> a >> d;
test[n_p][a].hp -= test[1 ^ n_p][d].ad;
test[1 ^ n_p][d].hp -= test[n_p][a].ad;
if (test[n_p][a].hp <= 0) test[n_p].erase(test[n_p].begin() + a);
if (test[1 ^ n_p][d].hp <= 0 && d!=0) test[1 ^ n_p].erase(test[1 - n_p].begin() + d);
}
else if (s == "end") n_p ^= 1;
}//游戏结束
if (test[0][0].hp > 0 && test[1][0].hp > 0) cout << 0 << endl;
else if (test[0][0].hp > 0) cout << 1 << endl;
else if (test[1][0].hp > 0) cout << -1 << endl;//输出比赛结果
cout << test[0][0].hp << endl; //先手方的生命值
cout << test[0].size() - 1 << " ";
for (int i = 1; i < test[0].size(); i++){//先手方的随从状态
if (i < test[0].size() - 1) cout << test[0][i].hp << " ";
else cout << test[0][i].hp;
}
cout << endl;
cout << test[1][0].hp << endl;//后手方的生命值
cout << test[1].size() - 1 << " ";
for (int i = 1; i < test[1].size(); i++) {//后手方的随从状态
if (i < test[1].size() - 1) cout << test[1][i].hp << " ";
else cout << test[1][i].hp;
}
cout << endl;
return 0;
}