CCF201609-3

博客园的大佬的源码给我提供了很多帮助。

这个题最省事的部分在于使用了vector中的insert()erase()方法,放置随从等操作简洁了许多。

以攻击操作为例,在一方的某随从攻击指定随从后,遍历双方的随从(使用迭代器),发现生命值小于等于0的,即从随从数组中抹去。

end()函数的意义在于,在一方结束后,及时综合考察整个战场的状况。

#include<bits/stdc++.h>

using namespace std;
int n;
string cmd;
int now=0;
struct node{
	int attack;
	int health;
	node(int _attack,int _health):attack(_attack),health(_health){}
};
vector<node> smn[2];
vector<node>::iterator it;

void init(){
	for(int i=0;i<2;i++){
		smn[i].clear();
		smn[i].push_back(node(0,30));
	}
	now=0;
}
void summon(){
	int position,attack,health;
	cin>>position>>attack>>health;
	it=smn[now].begin();
	smn[now].insert(it+position,node(attack,health));
}
void attack(){
	int attacker,defender;
	cin>>attacker>>defender;
	smn[now][attacker].health-=smn[now^1][defender].attack;
	smn[now^1][defender].health-=smn[now][attacker].attack;
	for(int i=0;i<2;i++){
		for(it=smn[i].begin()+1;it<smn[i].end();it++){
			if((*it).health<=0){
				smn[i].erase(it);
			}
		}
	}
}
void end(){
	if(smn[0][0].health<=0&&smn[1][0].health>0){
		printf("-1
");
	}else if(smn[0][0].health>0&&smn[1][0].health>0){
		printf("0
");
	}else{
		printf("1
");
	}
	for(int i=0;i<2;i++){
		printf("%d
",smn[i][0].health);
		printf("%d",(int)smn[i].size()-1);
		for(int j=1;j<(int)smn[i].size();j++){
			printf(" %d ",smn[i][j].health);
		}
		printf("
");
	}

}
int main(){
	init();
	cin>>n;
	while(n--){
		cin>>cmd;
		if(cmd=="summon"){
			summon();
		}else if(cmd=="attack"){
			attack();
		}else if(cmd=="end"){
			now^=1;
		}
	}
	end();
	return 0;
}
原文地址:https://www.cnblogs.com/master-cn/p/12912921.html