题目要求
Sample Input
8
summon 1 3 6
summon 2 4 2
end
summon 1 4 5
summon 1 2 1
attack 1 2
end
attack 1 1
Sample Output
0
30
1 2
30
1 2
思路
使用结构体retinue记录英雄或随从,其成员有攻击力、生命值。玩家的角色用二维数组表示,本别表示两位玩家和8个角色,其中retinue[i][0]表示当前玩家的英雄。
声明二维数组时使用vector,以便后续的删除插入操作。
玩家的操作有三种:
- 召唤随从:即vector的插入操作,插入到对应位置。
- 随从攻击:攻击发生后,由于攻击方不可能使用英雄攻击,故不需要考虑英雄死亡的情况,只需考虑随从死亡的情况。若随从死亡,将随从从数组中删除。
而被攻击方可能是英雄被攻击,故需要考虑英雄死亡的情况。若随从死亡,将随从删除。若英雄死亡,游戏结束,此时攻击方为获胜方,记录获胜方。 - 结束回合:即转换攻击方与被攻击方。先手玩家记为0,后手玩家记为1,转换攻击方只需要将当前攻击方更改,即player=1-player。
代码
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n,pstn,atck,hlth,attacker,defender;
string action;
struct retinue{
int attack,health;
retinue(){}
retinue(int a,int h){attack=a;health=h;}
};
vector<retinue> ret[2];
void summon(int player){
vector<retinue>::iterator it=ret[player].begin();
for(int i=0;i<pstn;i++)it++;
ret[player].insert(it, retinue(atck,hlth));
}
void attack(int player){
ret[player][attacker].health-=ret[1-player][defender].attack;
ret[1-player][defender].health-=ret[player][attacker].attack;
if(ret[player][attacker].health<=0){//攻击方死亡
vector<retinue>::iterator it=ret[player].begin();
for(int i=0;i<attacker;i++)it++;
ret[player].erase(it);
}
if(ret[1-player][defender].health<=0){//被攻击方死亡
if(defender!=0){//随从死亡
vector<retinue>::iterator it=ret[1-player].begin();
for(int i=0;i<defender;i++)it++;
ret[1-player].erase(it);
}
}
}
int main(){
cin>>n;
int player=0,winner=0;
for(int i=0;i<2;i++)
ret[i].push_back(retinue(0,30));
while(n--){
cin>>action;
if(action=="summon"){
cin>>pstn>>atck>>hlth;
summon(player);
}
else if(action=="attack"){
cin>>attacker>>defender;
attack(player);
if(winner==0&&ret[1-player][0].health<=0){//被攻击方英雄死亡
winner=(player==0?1:-1);
}
}
else{
player=1-player;
}
}
cout<<winner<<endl;
for(int i=0;i<2;i++){
cout<<ret[i][0].health<<endl;
cout<<ret[i].size()-1<<" ";
for(int j=1;j<ret[i].size();j++)
cout<<ret[i][j].health<<" ";
cout<<endl;
}
return 0;
}