CSP201609-3炉石传说

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目分析:

首先根据题意,有两个玩家角色,每个角色有一个英雄以及至多7个随从,可以进行召唤随从和攻击对方的操作,我认为本题关键在于数据的存储以及理解,因为题目要求任意时刻,战场上的随从总是从1开始连续编号。召唤新的随从时原来该位置及右边的所有随从编号都会增加 1。而当一个随从死亡时,它右边的所有随从编号都会减少 1。所以随从的位置是动态变化的,所以在这里采用相当于动态数组的vector来存储,根据vector对象的常用内置函数可以很容易实现题目要求的动态变化。C++vector操作

  • 因为题目指出0表示攻击对方英雄,所以在存储的时候,先在第0个位置存入英雄的数据,再每次从第1个位置开始对随从的位置进行调整变化,同时要注意在随从攻击的时候,需要先判断被攻击方是不是英雄,如果是英雄,那么不用删除已经死亡的英雄,如果是随从,则需要及时删除已经死亡(生命值<=0)的随从。
  • 每个回合结束,即每次遇到end操作,需要进行角色的替换rolenum=1-rolenum。
  • 最后输出结果的时候注意最后结果为5行,所以需要在输出先手方和后手方的存活的随从个数和各随从的生命值的循环之后加上cout<<endl;(注意,cout<<endl;不能放在里面,因为当没有随从存活的时候循环内部将无法执行,无法输出换行 我就是因为这个小地方卡在了80分很久的!!!)

代码:

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
struct node//节点 
{
	int attack;//攻击力
	int health;//生命值
	node(int a,int h)
	{
		attack=a;
		health=h;
	}
};
int main()
{
	int n;//操作个数
	cin>>n;
	vector<node> role[2];

	role[0].push_back(node(0,30));//游戏开始时,英雄的生命值为 30,攻击力为 0。
	role[1].push_back(node(0,30));
	
	int rolenum=0;

	for(int i=0;i<n;i++)
	{
		string s;
		cin>>s;
		if(s=="summon")//召唤随从
		{
			int p,a,h;//位置,攻击力,生命值 
			cin>>p>>a>>h;
			role[rolenum].insert(role[rolenum].begin()+p,node(a,h));	
		} 
		else if(s=="attack")//随从攻击
		{
			int a,d;//攻击方,被攻击方
			cin>>a>>d; 
			bool hero=false;
			if(d==0)//0 表示攻击对方英雄
			{
				hero=true;
			}
			role[rolenum][a].health-=role[1-rolenum][d].attack;
			role[1-rolenum][d].health-=role[rolenum][a].attack;
			
			if(role[rolenum][a].health<=0)//随从死亡 
			{
				role[rolenum].erase(role[rolenum].begin()+a);
			}
			if(role[1-rolenum][d].health<=0&&!hero)
			{
				role[1-rolenum].erase(role[1-rolenum].begin()+d);
			}	
		} 
		else if(s=="end")//结束回合
		{
			rolenum=1-rolenum;
		} 
	}
	if(role[0][0].health>0 && role[1][0].health>0 ) //游戏未结束 
	{
		cout<<0<<endl;
	}
	else if(role[0][0].health>0 && role[1][0].health<=0)//先手胜 
	{
		cout<<1<<endl;
	}
	else if(role[0][0].health<=0 && role[1][0].health>0)//后手胜 
	{
		cout<<-1<<endl;
	}
	
	cout<<role[0][0].health<<endl;//先手方 
	int ans=role[0].size();
	cout<<ans-1<<" ";
	for(int i=1;i<role[0].size();i++)
	{
		if(i<role[0].size()-1)
		{
			cout<<role[0][i].health<<" ";
		}
		else
		{
			cout<<role[0][i].health;
		}	
	}
	cout<<endl;
	
	cout<<role[1][0].health<<endl;//后手方 
	int ans1=role[1].size();
	cout<<ans1-1<<" ";
	for(int i=1;i<role[1].size();i++)
	{
		if(i<role[1].size()-1)
		{
			cout<<role[1][i].health<<" ";
		}
		else
		{
			cout<<role[1][i].health;
		}	
	}
	cout<<endl;	
	return 0;	
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值