试题编号: 201609-3
试题名称: 炉石传说
时间限制: 1.0s
内存限制: 256.0MB
场上的两名玩家轮流进行游戏,每个玩家场上最多有7个随从,而场上的随从总是从左到右排列,即在场上不会有空位。
玩家拥有两种操作:召唤(summon)和攻击(attack)。由题意可知,随从的召唤位置在当前场上所有随从最左边和最右边(1到m+1,m代表场上随从数量)之间,即召唤不会使得新的随从和原有随从之间产生空位。如果召唤随从的目标位置已经存在随从,那么改随从和它右边的随从都会向右移动一位(题目规定当场上存在7个随从时一定不会发生召唤)。当一个随从进行攻击时,攻击方和被攻击方的生命值都会减去对方的攻击力,当随从生命值小于等于零就会死亡,此时这个随从右边的所有随从都会向左移动一位,使得随从之间没有空位。
我们可以看到随从总是向左填补空位,只有有新的随从加入时,才会有随从向右移动。因此,可以想到用数组模拟随从的行为,随从的移动就转化为了数组元素的调整。为了使得代码更加清晰,下文中的代码用结构体表示随从和玩家,玩家的结构体中的随从数组用来表示该玩家场上的随从,为了方便起见,下标为0的随从用来记录玩家自己的信息,(因为题目中attack目标值为0时随从攻击对方玩家),同时,在结构体重加入了表示玩家行为(召唤和攻击)的函数。模拟每轮游戏的进行情况,每一回合结束后判断是否有随从死亡,如果有,就对玩家结构体内随从的队列进行调整,但是如果是玩家(下标为0的随从)死亡,就不需要进行调整了,否则会影响战果的判断。
输出结果时,只需要输出结构体中相应元素的值。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
//记录随从的信息
struct Servent {
int atk, health;
void attack(Servent &defender) {
this->health -= defender.atk;
defender.health -= this->atk;
}
};
//记录玩家的信息
struct Player {
int serventNum;
Servent servent[8];
Player() {
serventNum = 0;
servent[0].health = 30;
}
//召唤随从
void summon(int pos,int at,int heal) {
//随从移位
for (int i = serventNum; i >= pos; i--) {
servent[i + 1] = servent[i];
}
servent[pos].health = heal;
servent[pos].atk = at;
serventNum++;
}
//随从攻击
void serventAttack(int a, int b,Player &another) {
servent[a].attack(another.servent[b]);
//如果随从死亡,调整队列
if (a != 0 && servent[a].health <= 0) {
for (int i = a; i<serventNum; i++)
servent[i] = servent[i + 1];
serventNum--;
}
if (b != 0 && another.servent[b].health <= 0) {
for (int i = b; i<another.serventNum; i++)
another.servent[i] = another.servent[i + 1];
another.serventNum--;
}
}
//输出场上情况
void printStage() {
cout << servent[0].health << endl;
cout << serventNum;
for (int i = 1; i <= serventNum; i++) {
cout << ' ' << servent[i].health;
}
cout << endl;
}
}player[2];
int main() {
int n, round = 0, a, b, c;
string s;
cin >> n;
while (n--) {
cin >> s;
if (s[0] == 'e') {
round = 1 - round;
}
else if (s[0] == 's') {
//召唤随从
cin >> a >> b >> c;
player[round].summon(a, b, c);
}
else {
//随从攻击
cin >> a >> b;
player[round].serventAttack(a, b,player[1-round]);
}
}
if (player[0].servent[0].health <= 0) cout << -1 << endl;
else if (player[1].servent[0].health <= 0) cout << 1 << endl;
else cout << 0 << endl;
player[0].printStage();
player[1].printStage();
}