这道题,我用的是vector来模拟战场,vector可以任意的操作和删除,所以用起来很方便。。。
100分代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
int x=30,y=30;
//先手英雄 后手英雄
struct act
{
int pos;
int att;
int live;
act(int poss,int attt,int livee)
{
pos=poss;
att=attt;
live=livee;
}
};
vector<act>v0,v1;//先手战场 后首战场
void update()
{
for(int i=0; i<v0.size(); i++)
{
act k=v0[i];
if(k.live<=0)v0.erase(v0.begin()+i);
}
for(int i=0; i<v1.size(); i++)
{
act k=v1[i];
if(k.live<=0)v1.erase(v1.begin()+i);
}
}
void buid(int flag,act a)
{
if(flag==0)
{
v0.insert(v0.begin()+a.pos-1,1,a);
}
else
{
v1.insert(v1.begin()+a.pos-1,1,a);
}
}
void gg(int flag,int a,int b)
{
if(flag==0)
{
if(b==0)
{
y-=v0[a-1].att;
}
else
{
v0[a-1].live-=v1[b-1].att;
v1[b-1].live-=v0[a-1].att;
}
}
else
{
if(b==0)
{
x-=v1[a-1].att;
}
else
{
v1[a-1].live-=v0[b-1].att;
v0[b-1].live-=v1[a-1].att;
}
}
update();
}
int main()
{
v0.clear();
v1.clear();
int n;
scanf("%d",&n);
int flag=0;//先手状态
string s;
int a,b,c;
for(int i=0; i<n; i++)
{
cin>>s;
if(s=="end")
{
flag=!flag;
continue;
}
else if(s=="summon")
{
scanf("%d%d%d",&a,&b,&c);
if(x<=0||y<=0)continue;
if(flag==0)
{
if(v0.size()==7)continue;
}
else
{
if(v1.size()==7)continue;
}
buid(flag,act(a,b,c));
}
else if(s=="attack")
{
scanf("%d%d",&a,&b);
if(x<=0||y<=0)continue;
gg(flag,a,b);
}
}
update();
if(x<=0)
printf("-1\n");
else if(y<=0)
printf("1\n");
else
printf("0\n");
cout<<x<<endl;
cout<<v0.size();
for(int i=0; i<v0.size(); i++)
{
cout<<" "<<v0[i].live;
}
cout<<endl;
cout<<y<<endl;
cout<<v1.size();
for(int i=0; i<v1.size(); i++)
{
cout<<" "<<v1[i].live;
}
cout<<endl;
}