程序设计实习MOOC/3129/B:魔兽世界之一:备战
B:魔兽世界之一:备战
总时间限制: 1000ms 内存限制: 65536kB
描述
魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。
红司令部,City 1,City 2,……,City n,蓝司令部
两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种属性。
双方的武士编号都是从1开始计算。红方制造出来的第n个武士,编号就是n。同样,蓝方制造出来的第n个武士,编号也是n。
武士在刚降生的时候有一个生命值。
在每个整点,双方的司令部中各有一个武士降生。
红方司令部按照iceman、lion、wolf、ninja、dragon的顺序循环制造武士。
蓝方司令部按照lion、dragon、ninja、iceman、wolf的顺序循环制造武士。
制造武士需要生命元。
制造一个初始生命值为m的武士,司令部中的生命元就要减少m个。
如果司令部中的生命元不足以制造某个按顺序应该制造的武士,那么司令部就试图制造下一个。如果所有武士都不能制造了,则司令部停止制造武士。
给定一个时间,和双方司令部的初始生命元数目,要求你将从0点0分开始到双方司令部停止制造武士为止的所有事件按顺序输出。
一共有两种事件,其对应的输出样例如下:
武士降生
输出样例: 004 blue lion 5 born with strength 5,2 lion in red headquarter
表示在4点整,编号为5的蓝魔lion武士降生,它降生时生命值为5,降生后蓝魔司令部里共有2个lion武士。(为简单起见,不考虑单词的复数形式)注意,每制造出一个新的武士,都要输出此时司令部里共有多少个该种武士。司令部停止制造武士
输出样例: 010 red headquarter stops making warriors
表示在10点整,红方司令部停止制造武士
输出事件时:
首先按时间顺序输出;
同一时间发生的事件,先输出红司令部的,再输出蓝司令部的。
输入
第一行是一个整数,代表测试数据组数。
每组测试数据共两行。
第一行:一个整数M。其含义为, 每个司令部一开始都有M个生命元( 1 wushi类有六个静态成员:
1.字符串数组wushiName[5]存放五种武士的种类名称,通过输入获取
2.红魔武士的建造顺序,存放在整型数组redWushiSeq[5]中,为固定值
3.蓝魔武士的建造顺序,存放在整型数组redWushiSeq[5]中,为固定值
4.用一个整型数组wushiNum[12]存放不同种类的武士的数量。下标为0-5的六个元素存放的是红魔武士的数量,下标为5的元素存放红魔武士的总数量,即红魔武士编号。下标为6-11的六个元素存放的是蓝魔武士的数量,下标为11的元素存放蓝魔武士的总数量,即红魔武士编号。
5.武士的生命值数组wushiLife[5],存放不同种类武士的生命值,通过输入获取
6.最小武士的生命值minWushiLife,int类型
武士类还有两个普通成员变量:
1.整型变量headquarterType代表该武士属于哪个司令营,0表示红魔武士,6表示蓝魔武士
2.整型变量type表示武士种类,比如0代表dragon武士(0 dragon 、1 ninja、2 iceman、3 lion、4 wolf)
通过这两个普通成员变量headquarterType和type就可以知道该武士是哪个司令营的何种武士,比如headquarterType==0并且type==0则表示该武士是红魔司令营的dragon武士。
武士类构造函数:武士wushi类的构造函数中会执行对应种类type的武士数量增一的操作。
武士类还有两个普通成员函数getNo()和getWushiNum(),一个静态成员函数minLife()。getNo()返回武士的编号,getWushiNum()返回该种武士在所在的司令营中的数量,minLife()返回最小武士生命值。
武士类wushi代码
class wushi{public: static string wushiName[5]; //武士种类名称 static int redWushiSeq[5]; //红魔武士顺序 static int blueWushiSeq[5]; //蓝魔武士顺序 static int wushiNum[12]; //武士数量 0-5红 6-11蓝 static int wushiLife[5]; //武士的生命值数组 static int minWushiLife; //武士生命值的最小值 int headquarterType; //司令营 0红 6蓝 int type; //武士种类 0 dragon 、1 ninja、2 iceman、3 lion、4 wolf wushi(int t, int h): type(t), headquarterType(h) { wushiNum[h + 5]++; //总数 wushiNum[h + t]++; //对应武士种类 } / 获取编号值 */ int getNo() { return wushiNum[headquarterType + 5]; } / 获取当前武士种类的数量 */ int getWushiNum() { return wushiNum[headquarterType + type]; } / 计算最小武士生命值并返回 */ static int minLife();};int wushi::minLife(){ int minL = wushiLife[0]; for(int i = 1; i wushiLife[i]) { minL = wushiLife[i]; } } return minL;}
司令营类headquarter
司令营类headquarter有一个静态成员变量totaLife表示总生命元。
司令营类headquarter有四个普通成员变量:
1.司令营的类型headquarterType,标识是红魔司令营还是蓝魔司令营,int型,0表示红,6表示蓝
2.司令营的剩余生命元life,int
3.司令营是否停止建造武士isStop,bool
4.当前准备建造的武士的循环次序号seq (初始时为0,建造司令营中的第一个武士则次序号seq为0,建造第二个次序号seq为1,建造第三个次序号seq为2,...,第五个次序号seq为0,依次循环下去)
司令营类headquarter的构造函数需要指定司令营的类型,确定是红魔司令营还是蓝魔司令营。司令营剩余生命值life初始化为总生命元totaLife,isStop为false,seq初始值为0。
司令营类有两个普通成员函数bulidWushi()和stopBulid(),bulidWushi()在指定的时刻建造武士,stopBulid()在指定时刻停止建造武士的任务。
司令营类headquarter代码
class headquarter{public: static int totaLife; //总生命元 int headquarterType; //司令营 0红 6蓝 int life; //剩余生命元 bool isStop; //是否停止建造武士 int seq; //当前建造武士次序号 headquarter(int hT): headquarterType(hT), life(totaLife), isStop(false), seq(0) {} void bulidWushi(int time, wushi bwushi); void stopBulid(int time);};void headquarter::bulidWushi(int time, wushi bwushi){ cout.fill('0'); //设置填充字符 cout.width(3); //设置域宽 cout # include# includeusing namespace std;const int RED = 0;const int BLUE = 6;class wushi{public: static string wushiName[5]; //武士种类名称 static int redWushiSeq[5]; //红魔武士顺序 static int blueWushiSeq[5]; //蓝魔武士顺序 static int wushiNum[12]; //武士数量 0-5红 6-11蓝 static int wushiLife[5]; //武士的生命值数组 static int minWushiLife; //武士生命值的最小值 int headquarterType; //司令营 0红 6蓝 int type; //武士种类 0 dragon 、1 ninja、2 iceman、3 lion、4 wolf wushi(int t, int h): type(t), headquarterType(h) { wushiNum[h + 5]++; //总数 wushiNum[h + t]++; //对应武士种类 } / 获取编号值 */ int getNo() { return wushiNum[headquarterType + 5]; } / 获取当前武士种类的数量 */ int getWushiNum() { return wushiNum[headquarterType + type]; } / 计算最小武士生命值并返回 */ static int minLife();};int wushi::minLife(){ int minL = wushiLife[0]; for(int i = 1; i wushiLife[i]) { minL = wushiLife[i]; } } return minL;}class headquarter{public: static int totaLife; //总生命元 int headquarterType; //司令营 0红 6蓝 int life; //剩余生命元 bool isStop; //是否停止建造武士 int seq; //当前建造武士次序号 headquarter(int hT): headquarterType(hT), life(totaLife), isStop(false), seq(0) {} void bulidWushi(int time, wushi bwushi); void stopBulid(int time);};void headquarter::bulidWushi(int time, wushi bwushi){ cout.fill('0'); //设置填充字符 cout.width(3); //设置域宽 cout > testn; //输入测试数据组数 while(testn > casen) { time = 0; casen++; //当前测试数据组 memset(wushi::wushiNum, 0, sizeof(int) * 12); /* 输入总生命元和武士生命值 */ cin >> headquarter::totaLife >> wushi::wushiLife[0] >> wushi::wushiLife[1] >> wushi::wushiLife[2] >> wushi::wushiLife[3] >> wushi::wushiLife[4]; cout = wushi::wushiLife[wType]) { /* 造武士 */ wushi wRed(wType, RED); redH.bulidWushi(time, wRed); } else if(redH.life >= wushi::minWushiLife) { /* 当前生命元不足,造下一个武士 */ redH.seq = (redH.seq + 1) % 5; //下一个 wType = wushi::redWushiSeq[redH.seq]; while(redH.life = wushi::wushiLife[wType]) { /* 造武士 */ wushi wBlue(wType, BLUE); blueH.bulidWushi(time, wBlue); } else if(blueH.life >= wushi::minWushiLife) { /* 当前生命元不足,造下一个武士 */ blueH.seq = (blueH.seq + 1) % 5; //下一个 wType = wushi::blueWushiSeq[blueH.seq]; while(blueH.life # include# includeusing namespace std;class wushiRed{public: static int wushiNum[6]; int type; //武士种类 0 dragon 、1 ninja、2 iceman、3 lion、4 wolf int no; //编号 int life; //生命值 int gong; //攻击力 wushiRed(int t, int n, int l, int g = 0): type(t), no(n + 1), life(l), gong(g) { wushiNum[5]++;//总数 wushiNum[t]++;//对应武士种类 }};class wushiBlue{public: int type; //武士种类 0 dragon 、1 ninja、2 iceman、3 lion、4 wolf int no; //编号 int life; //生命值 int gong; //攻击力 static int wushiNum[6]; wushiBlue(int t, int n, int l, int g = 0): type(t), no(n + 1), life(l), gong(g) { wushiNum[5]++;//总数 wushiNum[t]++;//对应武士种类 }};int minLife(int array[], int n){ int min = array[0]; for(int i = 1; i array[i]) { min = array[i]; } } return min;}int wushiRed::wushiNum[] = {0};int wushiBlue::wushiNum[] = {0};int main(){ //freopen("in.txt","r",stdin); int testn; //测试数据组数 int casen = 0; //目前测试组数 int totalLife; //总的生命元 int redLife; //红魔生命元 int blueLife; //蓝魔生命元 int redWushi = 0; //当前建造红魔武士次序号 int blueWushi = 0; //当前建造蓝魔武士次序号 string wushiName[] = {"dragon", "ninja", "iceman", "lion", "wolf"}; int redWushiSeq[] = {2, 3, 4, 1, 0};//红魔武士顺序 int blueWushiSeq[] = {3, 0, 1, 2, 4};//蓝魔武士顺序 int wushiLife[5]; //武士的生命值数组 bool redStop = false; //红魔是否停止 bool blueStop = false; //蓝魔是否停止 int minWushiLife = 0; //武士生命值的最小值 int time = 0; //时刻 cin >> testn; //输入测试数据组数 while(testn > casen) { memset(wushiRed::wushiNum, 0, sizeof(int) * 6); memset(wushiBlue::wushiNum, 0, sizeof(int) * 6); time = 0; //输入总生命元和武士生命值 cin >> totalLife >> wushiLife[0] >> wushiLife[1] >> wushiLife[2] >> wushiLife[3] >> wushiLife[4]; casen++; //当前测试数据组 cout = 0) //红魔还有生命元并且没有停止建造 { int wType = redWushiSeq[redWushi];//当前准备建造的武士种类 //cout= wushiLife[wType]) { wushiRed wRed(wType, wushiRed::wushiNum[5], wushiLife[wType]); //cout = minWushiLife) { for(int i = 0 ; i = wushiLife[wType])//造武士 { wushiRed wRed(wType, wushiRed::wushiNum[5], wushiLife[wType]); //cout = 0) //蓝魔还有生命元并且没有停止建造 { int wType = blueWushiSeq[blueWushi];//当前准备建造的武士种类 //cout= wushiLife[wType]) { wushiBlue wBlue(wType, wushiBlue::wushiNum[5], wushiLife[wType]); //cout = minWushiLife) { for(int i = 0 ; i = wushiLife[wType])//造武士 { wushiBlue wBlue(wType, wushiBlue::wushiNum[5], wushiLife[wType]); //cout << "004 blue lion 5 born with strength 5,2 lion in red headquarter" << endl; cout.fill('0');//设置填充字符 cout.width(3);//设置域宽 cout << time; cout << " blue " << wushiName[wType] << " " << wBlue.no << " born with strength " << wushiLife[wType] << "," << wushiBlue::wushiNum[wType] << " " << wushiName[wType] << " in blue headquarter" << endl; blueLife -= wushiLife[wType]; blueWushi = (blueWushi + 1) % 5; break; } } } else { blueStop = true; cout.fill('0');//设置填充字符 cout.width(3);//设置域宽 cout << time; cout << " blue headquarter stops making warriors" << endl; } } time++;//下一时刻 } }}
c++
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!