题目描述
题目分析
题目是说给定上场顺序和攻击顺序,问最后的场上情况。其实就是一个文件模拟,对两个用户轮流操作,如果是召唤就执行特定位置的插入操作,如果是攻击就执行修改操作,并将不合法的(死亡的)删除。
注意每次攻击后判断win是否改变,如果改变了则证明有一方英雄死亡,break掉即可。
代码
#define _ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include <bits/stdc++.h>
using namespace std;
int id;//0表示玩家1,1表示玩家2
int win=-1;//初始平局-1
string s;
int n;
int position,attack,health;
int attacker,defender;
struct node
{
int blood=30;
int sum=0;
int attack[9];
int health[9];
void put(int pos,int a,int h)
{
if(pos==sum+1)
{
sum++;
attack[sum]=a;
health[sum]=h;
}
else
{
for(int i=7;i>pos;i--)
{
attack[i]=attack[i-1];
health[i]=health[i-1];
}
attack[pos]=a;
health[pos]=h;
sum++;
}
}
void del()
{
int flag=-1;
for(int i=1;i<=sum;i++)
if(health[i]<=0) flag=i;
if(flag==-1) return;
else if(flag==7)
{
sum--;
health[flag]=0;
attack[flag]=0;
return;
}
for(int i=flag;i<7;i++)
{
health[i]=health[i+1];
attack[i]=attack[i+1];
}
health[7]=0;
attack[7]=0;
sum--;
}
}player[2];
void atk(int id,int at,int de)
{
if(de==0)
{
player[1-id].blood-=player[id].attack[at];
if(player[1-id].blood<=0)
{
win=id;
}
return;
}
player[id].health[at]-=player[1-id].attack[de];
player[1-id].health[de]-=player[id].attack[at];
player[id].del();
player[1-id].del();
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s;
if(s=="summon")
{
cin>>position>>attack>>health;
player[id].put(position,attack,health);
}
else if(s=="attack")
{
cin>>attacker>>defender;
atk(id,attacker,defender);
if(win!=-1)break;
}
else if(s=="end") id=1-id;
}
if(win==-1) cout<<0;
else if(win==0) cout<<1;
else if(win==1) cout<<-1;
cout<<endl;
cout<<player[0].blood<<endl;
cout<<player[0].sum<<" ";
for(int i=1;i<=player[0].sum;i++)
cout<<player[0].health[i]<<" ";
cout<<endl;
cout<<player[1].blood<<endl;
cout<<player[1].sum<<" ";
for(int i=1;i<=player[1].sum;i++)
cout<<player[1].health[i]<<" ";
return 0;
}