试题编号: | 201609-3 |
---|---|
试题名称: | 炉石传说 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | ![]() |
输入输出格式
样例输入输出
测评规模
思路
这里使用暴力模拟的办法,设置一个结构体servent来表示英雄和随从,为两名选手各给一个容量为8的servent数组,其中0号位置代表英雄,其他位置可放置随从,并设置一个位置计数,表示最后一个放置了角色的位置。
对于三种操作,召唤随从则将数组中的后续随从右移。
攻击操作,需要在攻击结束后判断角色是否死亡,若死亡则部分角色左移,这里注意不能把英雄角色去除掉。
因为每一回合结束操作的发出者会发生变化,所以这里使用两个指针来指向两个操作者,一旦出现end操作需要调换指针指向内容。
代码
在这里#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int n, turn, position, to, res, p1, p2;
struct servent
{
int life;
int atack;
}s[3][8];
void summon()
{
if (s[turn][7].atack != 0 && s[turn][7].life != 0)
{
cout << "你无法放置更多的随从!" << endl;
return;
}
if (turn == 1)
p1++;
else
p2++;
scanf("%d", &position);
if (s[turn][position].atack!=0&& s[turn][position].atack != 0)
{
if (position == 1)
{
for (int i = 7; i >= 2; i--)
s[turn][i].atack = s[turn][i - 1].atack, s[turn][i].life = s[turn][i - 1].life;
}
else
{
for (int i = 7; i >= position; i--)
s[turn][i].atack = s[turn][i - 1].atack, s[turn][i].life = s[turn][i - 1].life;
}
}
scanf("%d %d", &s[turn][position].atack, &s[turn][position].life);
}
void attack()
{
int a, b, num = 0, pos = 0;
scanf("%d %d", &a, &b);
s[to][b].life -= s[turn][a].atack;
s[turn][a].life -= s[to][b].atack;
if (b != 0)
{
if (s[to][b].life <= 0)
{
if (to == 1)
p1--;
else
p2--;
for (int i = b; i <= 6; i++)
{
if (num == 0 && s[to][i].atack == 0 && s[to][i].life == 0)
pos = i, num++;
s[to][i].atack = s[to][i + 1].atack, s[to][i].life = s[to][i + 1].life;
}
if (pos != 0 && num != 0)
s[to][pos - 1].atack = 0, s[to][pos - 1].life = 0;
}
}
num = 0, pos = 0;
if (s[turn][a].life <= 0)
{
if (turn == 1)
p1--;
else
p2--;
for (int i = a; i <= 6; i++)
{
if (num == 0 && s[turn][i].atack == 0 && s[turn][i].life == 0)
pos = i, num++;
s[turn][i].atack = s[turn][i + 1].atack, s[turn][i].life = s[turn][i + 1].life;
}
if (pos != 0 && num != 0)
s[turn][pos - 1].atack = 0, s[turn][pos - 1].life = 0;
}
}
int main()
{
for (int i = 0; i <= 2; i++)
for (int j = 0; j <= 7; j++)
s[i][j].atack = 0, s[i][j].life = 0;
string move;
turn = 1, to = 2, res = 0, p1 = 0, p2 = 0;
s[turn][0].atack = 0, s[turn][0].life = 30;
s[to][0].atack = 0, s[to][0].life = 30;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
cin >> move;
if (move == "summon")
summon();
if (move == "attack")
attack();
if (move == "end")
{
if (turn == 1)
turn = 2, to = 1;
else
turn = 1, to = 2;
}
if (res == 0 && s[1][0].life <= 0 && s[2][0].life > 0)
res = -1;
if (res == 0 && s[2][0].life <= 0 && s[1][0].life > 0)
res = 1;
}
cout << res << endl;
cout << s[1][0].life << endl;
cout << p1 << " ";
for (int i = 1; i <= 7; i++)
if (s[1][i].life != 0)
cout << s[1][i].life << " ";
cout << endl;
cout << s[2][0].life << endl;
cout << p2 << " ";
for (int i = 1; i <= 7; i++)
if (s[2][i].life != 0)
cout << s[2][i].life << " ";
cout << endl;
return 0;
}
插入代码片