题目描述
解题思路
将每个人用结构体存储生命和攻击力
用一个结构体二维数组存储所有人员信息
p[0,0]存储先手英雄,p[0,1~7]存储先手的随从
p[1,0]存储先手英雄,p[1,1~7]存储先手的随从
读入n个操作,执行这n个操作,最后输出所有人员的生命信息
sommon操作,将pos位置后面的人右移,然后将新随从插入到pos位置
attack操作,将双方生命减去对方的攻击值,如果死了并且不是英雄的话,将后面的随从往前移动一位
如果是end操作,交换双方操作对象(r = !r)
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <stack>
using namespace std;
struct people
{
int a;
int h;
}p[2][8]; //0为先手
void lmove(int i, int pos) //将随从左移
{
for (int j = pos; j < 7; j ++) p[i][j] = p[i][j + 1];
p[i][7] = {0, 0}; //最后一个空位进行清空
}
void print(int m) //输出
{
cout << p[m][0].h << endl; //输出英雄生命
int cnt = 0;
for (int i = 1; i <= 7; i ++)
{
if (p[m][i].h > 0) cnt ++;
else break;
}
cout << cnt;//输出存活的随从个数
for (int i = 1; i <= cnt; i ++) cout << " " << p[m][i].h;
cout << endl;
}
int main()
{
int n;
cin >> n;
//初始化
p[0][0] = {0, 30};
p[1][0] = {0, 30};
int r = 0; //定义先手为0,对手为!r
while (n --)
{
string op;
cin >> op;
if (op == "summon") //召唤随从
{
int pos, atk, heal;
cin >> pos >> atk >> heal;
for (int j = 7; j > pos; j --) p[r][j] = p[r][j - 1]; //右移
p[r][pos] = {atk, heal}; //插入新增的随从
}
else if (op == "attack") //攻击
{
int atker, defender;
cin >> atker >> defender;
//攻击方和被攻击方会同时对彼此造成等同于自己攻击力的伤害
p[r][atker].h -= p[!r][defender].a;
p[!r][defender].h -= p[r][atker].a;
//如果任一方(不是英雄的情况下)死了,将后面的随从左移
if (p[r][atker].h <= 0) lmove(r, atker);
if (defender != 0 && p[!r][defender].h <= 0) lmove(!r, defender);
}
else
{
r = !r; //交换操作方
}
}
if (p[0][0].h <= 0) cout << -1 << endl; //先手死了
else if (p[1][0].h <= 0) cout << 1 << endl; //对手死了
else cout << 0 << endl; //两个都没死
//输出双方人员情况
print(0);
print(1);
return 0;
}