问题描述
试题编号: | 201609-3 |
试题名称: | 炉石传说 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述 《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下: 输入格式 输入第一行是一个整数 n,表示操作的个数。接下来 n 行,每行描述一个操作,格式如下: 输出格式 输出共 5 行。 样例输入 8 样例输出 0 样例说明 按照样例输入从第 2 行开始逐行的解释如下: 评测用例规模与约定 * 操作的个数0 ≤ n ≤ 1000。 |
思路
模拟题,关键在于数据表示。
代码
#include<iostream> #include<vector> #include<string> #define OPONENT 1-player using namespace std; // 红黑双方,红先黑后 const int RED=0; const int BLACK=1; // 状态包括生命值和攻击力 struct status { int life, power; status(int l, int a) { life=l; power=a; } }; // 变量v用于存储英雄和随从的状态,v[0]为红方,v[1]为黑方 // 向量v[RED]和v[BLACK]中分别存储双方的英雄和随从的状态 // v[RED][0]存储红方英雄的状态,v[RED][1]到v[RED][7]存储随从的状态 vector<status> v[2]; int main() { int i,n,player=RED; string action; int position,attack,health; int attacker,defender; // 变量初始化:英雄在向量v中的位置为0 v[RED].push_back(status(30, 0)); v[BLACK].push_back(status(30, 0)); // 输入数据:命令数量n cin>>n; // 输入并且处理n个命令 while(n--) { cin>>action; if(action=="summon") { cin>>position>>attack>>health; v[player].insert(v[player].begin()+position,status(health,attack)); } else if(action=="attack") { cin>>attacker>>defender; // 当随从攻击时,攻击方和被攻击方会同时对彼此造成等同于自己攻击力的伤害。 // 受到伤害的角色的生命值将会减少,数值等同于受到的伤害。 v[player][attacker].life-=v[OPONENT][defender].power; v[OPONENT][defender].life-=v[player][attacker].power; // 攻击方(随从)生命结束则移除 if(v[player][attacker].life<=0) v[player].erase(v[player].begin()+attacker); // 防御方的随从生命结束则移除 if(defender!=0&&v[OPONENT][defender].life<=0) v[OPONENT].erase(v[OPONENT].begin()+defender); } else if(action=="end") player=OPONENT; } // 输出结果 // 第1行 if(v[RED][0].life<=0) cout<<-1<<endl; else if(v[BLACK][0].life<=0) cout<<1<<endl; else cout<<0<<endl; // 第2行 cout<<v[RED][0].life<<endl; // 第3行 cout<<v[RED].size()-1; for(i=1;i<(int)v[RED].size();i++) cout<<" "<<v[RED][i].life; cout<<endl; // 第4行 cout<<v[BLACK][0].life<<endl; // 第5行 cout<<v[BLACK].size()-1; for(i=1;i<(int)v[BLACK].size();i++) cout<<" "<<v[BLACK][i].life; cout<<endl; return 0; }