问题描述
试题编号: | 201609-3 |
试题名称: | 炉石传说 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下: 输入格式 输入第一行是一个整数 n,表示操作的个数。接下来 n 行,每行描述一个操作,格式如下: 输出格式 输出共 5 行。 样例输入 8 样例输出 0 样例说明 按照样例输入从第 2 行开始逐行的解释如下: 评测用例规模与约定 * 操作的个数0 ≤ n ≤ 1000。 |
从“原来该位置及右边的随从都将顺次向右移动一位”、“当一个随从死亡时,它右边的所有随从编号都会减少 1”来看,明显对应的是STL中的insert和erase。用vector动态数组存储。里面需要存储的数据就是角色的攻击力和生命值,位置可以用下标表示。用pair的第一个数据表示攻击力,第二个数据表示生命值就行。
70分的时候找了一处挺久的bug,是由于从先手玩家复制到后手玩家时有一个变量名没改变,发现后真的是无语,引以为戒引以为戒。
需要注意的是随从攻击后,如果被攻击方是英雄则不需要执行erase操作。
AC代码:
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#define P pair<int,int>//攻击力 ,生命值
using namespace std;
int main()
{
vector< P > role1; //先手玩家
vector< P > role2; //后手玩家
int n,count=1;
cin>>n;
P p;
p.first=0;p.second=30;
role1.push_back(p);//先手玩家的英雄
role2.push_back(p);//后手玩家的英雄
while(n--&&role1[0].second>0&&role2[0].second>0)
{
string order;
cin>>order;
if(order=="summon")//召唤随从
{
int pos,att,hel;//position attack health
cin>>pos>>att>>hel;
p.first=att;p.second=hel;
if(count%2==1)//先手玩家
role1.insert(role1.begin()+pos,p);
else role2.insert(role2.begin()+pos,p);//后手玩家
}
else if(order=="attack")//随从攻击
{
int atter,defer;//attacker defender
cin>>atter>>defer;
if(count%2==1)//先手玩家
{
//生命值减少
role1[atter].second-=role2[defer].first;
role2[defer].second-=role1[atter].first;
//若随从生命值小于等于0则死亡
if(role1[atter].second<=0) role1.erase(role1.begin()+atter);
if(role2[defer].second<=0&&defer>0) role2.erase(role2.begin()+defer);
}
else //后手玩家
{
role2[atter].second-=role1[defer].first;
role1[defer].second-=role2[atter].first;
if(role2[atter].second<=0) role2.erase(role2.begin()+atter);
if(role1[defer].second<=0&&defer>0) role1.erase(role1.begin()+defer);
}
}
else if(order=="end")//结束回合
{
count++;
}
}
if(role1[0].second<=0&&role2[0].second>0) cout<<"-1"<<endl;//后手玩家获胜
else if(role2[0].second<=0&&role1[0].second>0) cout<<"1"<<endl;//先手玩家获胜
else cout<<"0"<<endl;//未有人获胜
cout<<role1[0].second<<endl;//先手玩家英雄的生命值
cout<<role1.size()-1<<' ';//先手玩家尚存在的随从个数
for(int i=1;i<role1.size();i++)
cout<<role1[i].second<<' ';//先手玩家尚存在的各随从的生命值
cout<<endl;
cout<<role2[0].second<<endl;
cout<<role2.size()-1<<' ';
for(int i=1;i<role2.size();i++)
cout<<role2[i].second<<' ';
}