欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

炉石传说

程序员文章站 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;
}