问题描述
试题编号: | 201609-3 |
试题名称: | 炉石传说 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述 《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下: 输入格式 输入第一行是一个整数 n,表示操作的个数。接下来 n 行,每行描述一个操作,格式如下: 输出格式 输出共 5 行。 样例输入 8 样例输出 0 样例说明 按照样例输入从第 2 行开始逐行的解释如下: 评测用例规模与约定 * 操作的个数0 ≤ n ≤ 1000。 |
从“原来该位置及右边的随从都将顺次向右移动一位”、“当一个随从死亡时,它右边的所有随从编号都会减少 1”来看,明显对应的是STL中的insert和erase。用vector动态数组存储。里面需要存储的数据就是角色的攻击力和生命值,位置可以用下标表示。用pair的第一个数据表示攻击力,第二个数据表示生命值就行。
70分的时候找了一处挺久的bug,是由于从先手玩家复制到后手玩家时有一个变量名没改变,发现后真的是无语,引以为戒引以为戒。
需要注意的是随从攻击后,如果被攻击方是英雄则不需要执行erase操作。
AC代码:
1 #include<iostream> 2 #include<sstream> 3 #include<algorithm> 4 #include<string> 5 #include<cstring> 6 #include<iomanip> 7 #include<vector> 8 #include<cmath> 9 #include<ctime> 10 #include<stack> 11 #define P pair<int,int>//攻击力 ,生命值 12 using namespace std; 13 int main() 14 { 15 vector< P > role1; //先手玩家 16 vector< P > role2; //后手玩家 17 int n,count=1; 18 cin>>n; 19 P p; 20 p.first=0;p.second=30; 21 role1.push_back(p);//先手玩家的英雄 22 role2.push_back(p);//后手玩家的英雄 23 while(n--&&role1[0].second>0&&role2[0].second>0) 24 { 25 string order; 26 cin>>order; 27 if(order=="summon")//召唤随从 28 { 29 int pos,att,hel;//position attack health 30 cin>>pos>>att>>hel; 31 p.first=att;p.second=hel; 32 if(count%2==1)//先手玩家 33 role1.insert(role1.begin()+pos,p); 34 else role2.insert(role2.begin()+pos,p);//后手玩家 35 } 36 else if(order=="attack")//随从攻击 37 { 38 int atter,defer;//attacker defender 39 cin>>atter>>defer; 40 if(count%2==1)//先手玩家 41 { 42 //生命值减少 43 role1[atter].second-=role2[defer].first; 44 role2[defer].second-=role1[atter].first; 45 //若随从生命值小于等于0则死亡 46 if(role1[atter].second<=0) role1.erase(role1.begin()+atter); 47 if(role2[defer].second<=0&&defer>0) role2.erase(role2.begin()+defer); 48 } 49 else //后手玩家 50 { 51 role2[atter].second-=role1[defer].first; 52 role1[defer].second-=role2[atter].first; 53 if(role2[atter].second<=0) role2.erase(role2.begin()+atter); 54 if(role1[defer].second<=0&&defer>0) role1.erase(role1.begin()+defer); 55 } 56 } 57 else if(order=="end")//结束回合 58 { 59 count++; 60 } 61 } 62 63 if(role1[0].second<=0&&role2[0].second>0) cout<<"-1"<<endl;//后手玩家获胜 64 else if(role2[0].second<=0&&role1[0].second>0) cout<<"1"<<endl;//先手玩家获胜 65 else cout<<"0"<<endl;//未有人获胜 66 67 cout<<role1[0].second<<endl;//先手玩家英雄的生命值 68 cout<<role1.size()-1<<' ';//先手玩家尚存在的随从个数 69 for(int i=1;i<role1.size();i++) 70 cout<<role1[i].second<<' ';//先手玩家尚存在的各随从的生命值 71 cout<<endl; 72 73 cout<<role2[0].second<<endl; 74 cout<<role2.size()-1<<' '; 75 for(int i=1;i<role2.size();i++) 76 cout<<role2[i].second<<' '; 77 78 } 79