201609-3 | |
试题名称: | 炉石传说 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下: 输入格式 输入第一行是一个整数 n,表示操作的个数。接下来 n 行,每行描述一个操作,格式如下: 输出格式 输出共 5 行。 样例输入 8 样例输出 0 样例说明 按照样例输入从第 2 行开始逐行的解释如下: 评测用例规模与约定 * 操作的个数0 ≤ n ≤ 1000。
|
思路:用p1[],p2[]数组模拟随从,her1,her2记录英雄状态,根据其指令模拟操作即可,注意细节。
一发AC~~~~
code:
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#include<set>
#include<cmath>
#include<queue>
#include<algorithm>
#define rep(i,j,k) for(int i=j;i<k;++i)
#define mst(a,b) memset((a),(b),sizeof(a))
#include<cstring>
using namespace std;
typedef long long LL;
typedef vector<int,int> pii;
const int N = 10;
struct P{
int p,atkv,hp;
P(){}
P(int pp, int pa, int ph):p(pp),atkv(pa),hp(ph){}
};
P p1[N],p2[N];
P her1,her2;
int n,cnt1,cnt2;//记录当前随从个数
int main()
{
scanf("%d",&n);
char op[50];
int ctr = 1; // 1表示先手,-1表示后手 刚开始 为先手操作
int pos,atkv,hp,dfer,atker;
cnt1 = cnt2 = 1;
her1 = P(-1,0,30);
her2 = P(-1,0,30);
bool flag1 = true,flag2 = true; //标志英雄是否死亡
while(n--){
scanf("%s",&op);
if(ctr == 1){
if(op[0] == 's'){
scanf("%d%d%d",&pos,&atkv,&hp);
++cnt1;
for(int i = cnt1-1; i >= pos; --i){
p1[i].p += 1;
p1[i+1] = p1[i];
}
p1[pos] = P(pos,atkv,hp);
}
else if(op[0] == 'a'){
scanf("%d%d",&atker,&dfer);
if(dfer == 0){ //攻击对方的英雄
her2.hp -= p1[atker].atkv;
if(p1[atker].hp <= 0){
for(int i = atker; i < cnt1-1; ++i){
p1[i+1].p -= 1;
p1[i] = p1[i+1];
}
--cnt1; //随从死亡一个
}
if(her2.hp <= 0){
flag2 = false; // 英雄2死亡
break;
}
continue; // 不执行下面
}
p1[atker].hp -= p2[dfer].atkv;
p2[dfer].hp -= p1[atker].atkv;
if(p1[atker].hp <= 0){
for(int i = atker; i < cnt1-1; ++i){
p1[i+1].p -= 1;
p1[i] = p1[i+1];
}
--cnt1; //随从死亡一个
}
if(p2[dfer].hp <= 0){
for(int i = dfer; i < cnt2-1; ++i){
p2[i+1].p -= 1;
p2[i] = p2[i+1];
}
--cnt2;
}
}
else{
ctr *= -1;
}
}
else if(ctr == -1){
if(op[0] == 's'){
scanf("%d%d%d",&pos,&atkv,&hp);
++cnt2;
for(int i = cnt2-1; i >= pos; --i){
p2[i].p += 1;
p2[i+1] = p2[i];
}
p2[pos] = P(pos,atkv,hp);
}
else if(op[0] == 'a'){
scanf("%d%d",&atker,&dfer);
if(dfer == 0){
her1.hp -= p2[atker].atkv;
if(p2[atker].hp <= 0){
for(int i = atker; i < cnt2-1; ++i){
p2[i+1].p -= 1;
p2[i] = p2[i+1];
}
--cnt2;
}
if(her1.hp <= 0){
flag1 = false;
break;
}
continue; //英雄没有死亡时候 不执行下面 继续 其它操作
}
p2[atker].hp -= p1[dfer].atkv;
p1[dfer].hp -= p2[atker].atkv;
if(p2[atker].hp <= 0){
for(int i = atker; i < cnt2-1; ++i){
p2[i+1].p -= 1;
p2[i] = p2[i+1];
}
--cnt2;
}
if(p1[dfer].hp <= 0){
for(int i = dfer; i < cnt1-1; ++i){
p1[i+1].p -= 1;
p1[i] = p1[i+1];
}
--cnt1;
}
}
else{
ctr *= -1;
}
}
}
if(!flag1){
printf("-1\n");
}
else if(!flag2){
printf("1\n");
}
else{
printf("0\n");
}
printf("%d\n",her1.hp);
printf("%d",cnt1-1);
for(int i = 1; i < cnt1; ++i){
printf(" %d",p1[i].hp);
}
printf("\n");
printf("%d\n",her2.hp);
printf("%d",cnt2-1);
for(int i = 1; i < cnt2; ++i){
printf(" %d",p2[i].hp);
}
printf("\n");
return 0;
}