admin管理员组文章数量:1794759
CSP
试题编号: | 201609-3 |
---|---|
试题名称: | 炉石传说 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下:
输入格式输入第一行是一个整数 n,表示操作的个数。接下来 n 行,每行描述一个操作,格式如下:<action> <arg1> <arg2> … 其中<action>表示操作类型,是一个字符串,共有 3 种:summon表示召唤随从,attack表示随从攻击,end表示结束回合。这 3 种操作的具体格式如下:
|
思路:
刚看到这道题的时候就被这道题的题目量吓到了,但是细读之后感觉还好,首先题目中所有的序号变化(召唤随从,删除随从)都可以通过vector来实现。为了输入空格、回车、字符串、数字的方便,统一用字符串输入,所以最后又用到了字符串转换数字atoi(str.c_str()); |
以下是满分代码实现
#include <bits/stdc++.h>using namespace std;int n;
bool judge = true; //judge为true是玩家1执行命令,judge为false是玩家2执行命令struct node{int att; //攻击int heal; //生命
}aa[1005],bb[1005];vector<node> a,b; //玩家1和玩家2int main(){cin >> n;cin.get(); //吃掉回车符string action;/*因为随从下标从1开始,所以下标0存储英雄角色*/aa[0].att = 0;aa[0].heal = 30;bb[0].att = 0;bb[0].heal = 30;a.push_back(aa[0]);b.push_back(bb[0]);/*进行存储和判别*/for(int i = 1; i <= n; i++){/*为了解决字符串和数字以及空格类型(回车、空格等)之间的输入,直接都是字符串以回车结束getline(cin,action);以空格断开line >> 变量;*/getline(cin,action);istringstream line(action);line >> action;if(action == "summon"){string p,att,heal;int p1,att1,heal1;line >> p >> att >> heal;/*通过atoi(str.c_str())将字符串转换为数字类型*/p1 = atoi(p.c_str());att1 = atoi(att.c_str());heal1 = atoi(heal.c_str());if(judge){ //玩家1操作int j = a.size();aa[j].att = att1;aa[j].heal = heal1;a.insert(a.begin()+p1,aa[j]);}else{ //玩家2操作int j = b.size();bb[j].att = att1;bb[j].heal = heal1;b.insert(b.begin()+p1,bb[j]);}}else if(action == "end"){ //一个玩家结束,另一个玩家开始,取反judge = !judge;}else if(action == "attack"){ //某个玩家主杀string att1,att2;int attr1, attr2;line >> att1 >> att2;attr1 = atoi(att1.c_str());attr2 = atoi(att2.c_str());/*如果为玩家2操作杀戮,第一个输入的是玩家2的随从的坐标,调换一下*/if(!judge){int temp = attr1;attr1 = attr2;attr2 = temp;}/*杀戮之后进行玩家1话玩家2的随从的生命值计算存储*/b[attr2].heal -= a[attr1].att;a[attr1].heal -= b[attr2].att;/*某个玩家的随从生命<=0时,已死,删除,attr2 != 0是如果英雄死了,不应该删除英雄*/if(b[attr2].heal <= 0 && attr2 != 0){b.erase(b.begin()+attr2);}if(a[attr1].heal <= 0 && attr1 != 0){a.erase(a.begin()+attr1);}}if(a[0].heal <= 0 || b[0].heal <= 0){break;}}/*当时脑子抽风了,竟然写了个cout << a[0].heal-b[0].heal << endl;导致只有70分,我差点疯了,啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!*/if(a[0].heal <= 0){cout << "-1\n";}else if(b[0].heal <= 0){cout << "1\n" ;}else{cout << "0\n";}cout << a[0].heal << "\n" << a.size()-1 << " " ;for(int i = 1; i < a.size(); i++){cout << a[i].heal << " ";}cout << "\n" << b[0].heal << "\n" << b.size()-1 << " ";for(int i = 1; i < b.size(); i++){cout << b[i].heal << " ";}return 0;
}
最后注意结果的输出,我因为输出问题刚开始只有70分,如果最后结果都大于零,则不能进行比较,而是输出0,O(∩_∩)O。
欢迎留言o( ̄︶ ̄)o
本文标签: CSP
版权声明:本文标题:CSP 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1692768846a181575.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论