csp 201609-3 炉石传说

题目

csp 201609-3 炉石传说

题目大意

本题给出了炉石传说这个游戏的部分规则,主要是说场上有两名玩家,每位玩家由一张英雄卡和七张角色卡位。初始时英雄有30点生命和0点攻击,由先手开始,每个回合可以执行若干次以下三种操作:

  1. 召唤随从:玩家召唤一个随从进入战场,随从具有指定的生命值和攻击力。
  2. 随从攻击:玩家控制自己的某个随从攻击对手的英雄或者某个随从。
  3. 结束回合:玩家声明自己的当前回合结束,游戏将进入对手的回合。该操作一定是一个回合的最后一个操作。

随从攻击时攻击者和被攻击者均受到对方攻击力点数的伤害。当场上任一方英雄生命值小于等于零时(生命值可为负),此时不再进行其余操作,游戏结束。现在要求输出最终游戏结果,同时给出两位英雄剩余生命值和各自剩余随从数及其生命值。
注意随从死亡和插入随从均需要保证随从编号从1~n连续,这也是本题要处理的一个关键点。

解题思路

本题是一道模拟体,总体难度不大,但是需要用到vector中的内容,便于实现战斗过程中的复杂操作。如果不使用vector自带的操作,很有可能会出现许多小问题,且代码复杂。之前第一次尝试时就是因为代码太过复杂导致查错困难,卡在了90分,使用vector对于这种复杂模拟就比较有优势。
本题读懂题后可以发现题意其实很简单,只要记录每个人当前所有手牌的攻击力和生命值状态,再按要求进行相应的攻击操作。如果随从被击败就直接替换下,将他后面的随从编号依次向前移动。最终观察哪一方英雄生命值小于等于零,则对方自然就是胜者。这里需要注意的是插入随从和删除随从,vector自带的insert和erase函数可以完成。
综上所述,本题关键是要理解题意,读懂题目,随后用简洁明了的代码实现,代码过于冗长也会造成不必要的麻烦。

具体代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include<functional>
#define ll long long
#define MAXN 30005
#define inf 1e9

using namespace std;

struct node{
	int health;
	int attack;
	node(int h, int a) : health(h), attack(a) {}
};

vector<node> follow[2];

int main()
{
	int n,a,b,c;
	string op;
	cin >> n;
	int flag = 0;
	follow[0].push_back(node(30,0));
	follow[1].push_back(node(30,0));
	while(n--)
	{
		cin >> op;
		if(op == "summon")
		{
			cin >> a >> b >> c;
			follow[flag].insert(follow[flag].begin()+a,node(c,b));
		}
		else if(op == "attack")
		{
			cin >> a >> b;
			follow[flag][a].health -= follow[!flag][b].attack;
			follow[!flag][b].health -= follow[flag][a].attack;
            if(follow[flag][a].health <= 0 && a != 0) 
			{
                follow[flag].erase(follow[flag].begin()+a);
            }
            if(follow[!flag][b].health <= 0 && b != 0) 
			{
                follow[!flag].erase(follow[!flag].begin()+b);
            }
		}
		else if(op == "end") 
		{
            flag = !flag;
        }
	}
	if(follow[0][0].health > 0 && follow[1][0].health > 0)
	{
		cout << 0 << endl;
	}
	else if(follow[0][0].health > 0) 
	{
		cout << 1 << endl;
	}
	else if(follow[1][0].health > 0)
	{
		cout << -1 << endl;
    } 
    cout << follow[0][0].health << endl;
    cout << follow[0].size()-1 << " ";
    for(int i = 1; i < follow[0].size(); i++) 
	{
        cout << follow[0][i].health << " ";
    }
    cout << endl;
    cout << follow[1][0].health << endl;
    cout << follow[1].size()-1 << " ";
    for(int i = 1; i < follow[1].size(); i++) 
	{
        cout << follow[1][i].health << " ";
    }
    cout << endl;
    return 0;
}
原创文章 46 获赞 1 访问量 1498

猜你喜欢

转载自blog.csdn.net/weixin_43676449/article/details/105528780