csp 201609-3 炉石传说

试题编号: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; 
}
插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值