《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下:
输入格式
输入第一行是一个整数 n,表示操作的个数。接下来 n 行,每行描述一个操作,格式如下:
其中
输出格式
输出共 5 行。
第 1 行包含一个整数,表示这 n 次操作后(以下称为 T 时刻)游戏的胜负结果,1 表示先手玩家获胜,-1 表示后手玩家获胜,0 表示游戏尚未结束,还没有人获胜。
第 2 行包含一个整数,表示 T 时刻先手玩家的英雄的生命值。
第 3 行包含若干个整数,第一个整数 p 表示 T 时刻先手玩家在战场上存活的随从个数,之后 p 个整数,分别表示这些随从在 T 时刻的生命值(按照从左往右的顺序)。
第 4 行和第 5 行与第 2 行和第 3 行类似,只是将玩家从先手玩家换为后手玩家。
样例输入
8
summon 1 3 6
summon 2 4 2
end
summon 1 4 5
summon 1 2 1
attack 1 2
end
attack 1 1
样例输出
0
30
1 2
30
1 2
样例说明
按照样例输入从第 2 行开始逐行的解释如下:
1. 先手玩家在位置 1 召唤一个生命值为 6、攻击力为 3 的随从 A,是本方战场上唯一的随从。
2. 先手玩家在位置 2 召唤一个生命值为 2、攻击力为 4 的随从 B,出现在随从 A 的右边。
3. 先手玩家回合结束。
4. 后手玩家在位置 1 召唤一个生命值为 5、攻击力为 4 的随从 C,是本方战场上唯一的随从。
5. 后手玩家在位置 1 召唤一个生命值为 1、攻击力为 2 的随从 D,出现在随从 C 的左边。
6. 随从 D 攻击随从 B,双方均死亡。
7. 后手玩家回合结束。
8. 随从 A 攻击随从 C,双方的生命值都降低至 2。
评测用例规模与约定
思路
首先创建一个角色结构体,含有attack和health属性。
struct sc {
int attack;
int health;
sc() {
this->attack = 0;
this->health = 0;
}
sc(int a,int b) {
this->attack = a;
this->health = b;
}
};
然后创建两个角色vector,分别代表先手和后手,首先向其中插入攻击力为0,生命值为30的英雄,即将其放于0号点,然后使用cur记录当前轮到谁,如果指令为summon则在对应地方插入侍从,使用vector的insert方法可以不用手动右移,若指令为attack,则采用题目描述的方法攻击,然后计算最后的生命值即可,如果生命值小于等于零,则将其拿下,这里有一点需要注意的是,被攻击的可能是英雄,如果英雄死亡则游戏结束,也就是说下面的指令都无意义,所以各个生命值都应保持此刻状态,由于刚开始写的时候没有注意到这点,所以只拿了70分,增加对英雄的判断即可.
代码
#include<iostream>
#include<vector>
using namespace std;
struct sc {
int attack;
int health;
sc() {
this->attack = 0;
this->health = 0;
}
sc(int a,int b) {
this->attack = a;
this->health = b;
}
};
int main() {
int n;
cin>>n;
string tmp;
getchar();
vector<sc> p,q;
p.push_back(sc(0,30));
q.push_back(sc(0,30));
int cur = 0;
bool first = true;
int u = -1;
while(n) {
n--;
cin>>tmp;
int a,b,c;
if(tmp=="summon") {
cin>>a>>b>>c;
if(cur%2==0) {
if(p.size()<=a)
p.push_back(sc(b,c));
else
p.insert(p.begin()+a,sc(b,c));
} else {
if(q.size()<=a)
q.push_back(sc(b,c));
else
q.insert(q.begin()+a,sc(b,c));
}
} else if(tmp=="attack") {
cin>>a>>b;
if(cur%2==0) {
// cout<<q[b].health<<";"<<p[a].attack<<endl;
// for(int i=0;i<q.size();i++) cout<<q[i].health<<endl;
if(q.size()>b) {
q[b].health-=p[a].attack;
p[a].health-=q[b].attack;
}
if(q[b].health<=0&&b!=0) q.erase(q.begin()+b);
if(p[a].health<=0&&a!=0) p.erase(p.begin()+a);
} else {
if(p.size()>b) {
p[b].health-=q[a].attack;
q[a].health-=p[b].attack;
}
if(p[b].health<=0&&b!=0) p.erase(p.begin()+b);
if(q[a].health<=0&&a!=0) q.erase(q.begin()+a);
}
} else if(tmp=="end") {
cur++;
}
if(first && (p[0].health<=0 || q[0].health<=0)){
first = false;
if(p[0].health<=0) {
u = 1;
}
else{
u = 0;
}
while(n){
getline(cin,tmp);
n--;
}
}
}
// cout<<p.size()<<","<<q.size()<<endl;
if(u==1) cout<<-1<<endl;
else if(u==0) cout<<1<<endl;
else cout<<0<<endl;
cout<<p[0].health<<endl;
cout<<p.size()-1;
for(int i=1;i<p.size();i++) cout<<" "<<p[i].health;
cout<<endl;
cout<<q[0].health<<endl;
cout<<q.size()-1;
for(int i=1;i<q.size();i++) cout<<" "<<q[i].health;
cout<<endl;
return 0;
}
原文:https://www.cnblogs.com/mopa/p/13122180.html