程序设计实习MOOC(三)第三周005-魔兽世界之一:备战

题目描述

魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。
红司令部,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分开始到双方司令部停止制造武士为止的所有事件按顺序输出。
一共有两种事件,其对应的输出样例如下:

1) 武士降生
输出样例: 004 blue lion 5 born with strength 5,2 lion in red headquarter
表示在4点整,编号为5的蓝魔lion武士降生,它降生时生命值为5,降生后蓝魔司令部里共有2个lion武士。(为简单起见,不考虑单词的复数形式)注意,每制造出一个新的武士,都要输出此时司令部里共有多少个该种武士。

2) 司令部停止制造武士
输出样例: 010 red headquarter stops making warriors
表示在10点整,红方司令部停止制造武士

输出事件时:

首先按时间顺序输出;

同一时间发生的事件,先输出红司令部的,再输出蓝司令部的。

输入
第一行是一个整数,代表测试数据组数。

每组测试数据共两行。

第一行:一个整数M。其含义为, 每个司令部一开始都有M个生命元( 1 <= M <= 10000)。

第二行:五个整数,依次是 dragon 、ninja、iceman、lion、wolf 的初始生命值。它们都大于0小于等于10000。

输出
对每组测试数据,要求输出从0时0分开始,到双方司令部都停止制造武士为止的所有事件。
对每组测试数据,首先输出"Case:n" n是测试数据的编号,从1开始 。
接下来按恰当的顺序和格式输出所有事件。每个事件都以事件发生的时间开头,时间以小时为单位,有三位。
样例输入

1
20
3 4 5 6 7

样例输出

Case:1
000 red iceman 1 born with strength 5,1 iceman in red headquarter
000 blue lion 1 born with strength 6,1 lion in blue headquarter
001 red lion 2 born with strength 6,1 lion in red headquarter
001 blue dragon 2 born with strength 3,1 dragon in blue headquarter
002 red wolf 3 born with strength 7,1 wolf in red headquarter
002 blue ninja 3 born with strength 4,1 ninja in blue headquarter
003 red headquarter stops making warriors
003 blue iceman 4 born with strength 5,1 iceman in blue headquarter
004 blue headquarter stops making warriors

题解
其实昨天刚开始看到这道题很长很想放弃,但后来一看,我淦!这才第三周我就有不会的题了??于是今天好好的审了审题,起初还想用OOP(面向对象编程的方法)来解这道题,可能是还要写继承类??比如Dragon啊,或者是Iceman啊都是Warrior的继承?想想就害怕,索性放弃了这种方式。还是面向过程他比较香啊!!!于是就这样,就像挤牙膏一样写。。没办法,C++面向对象太难了,可能这道题就是最后那道hard题目的铺垫,需要用OOP的方式来编写。。之后再好好琢磨吧。先附上面向过程的代码:

#include <iostream>
#include <string>
#include <map>
using namespace std;
string convert(int n);
int main()
{
    string redHome[5]={"iceman","lion","wolf","ninja","dragon"};
    string blueHome[5]={"lion","dragon","ninja","iceman","wolf"};
    map<string,int> LifeTaken; //建立各个兵种和所需要的生命元的对照表
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        int m;
        cin>>m; //双方司令部生命元的总数
        int redLife=m; //
        int blueLife=m; //
        int a,b,c,d,e;
        cin>>a>>b>>c>>d>>e;
        LifeTaken["dragon"]=a;
        LifeTaken["ninja"]=b;
        LifeTaken["iceman"]=c;
        LifeTaken["lion"]=d;
        LifeTaken["wolf"]=e;
        //
        int cntRed=1; //红方武士数目
        int cntBlue=1; //蓝方武士数目
        int timeCoputer=0; //计时器
        cout<<"Case:"<<i<<endl;
        int typeSoliderRed=0; //对5取余得0,1,2,3,4.对应五种士兵
        int typeSoliderBlue=0;
        int NumOfWarriorsRed[5]={0}; //对应红方司令部各个兵种的数量
        int NumOfWarriorsBlue[5]={0};
        while(redLife>=0 || blueLife>=0)
        {
            string time=convert(timeCoputer); //将时间转换为三位字串
            //red Headquarter
            if(redLife>=0)
            {
                int counter1=0;
                bool flag1=false;
                while(redLife<LifeTaken[redHome[typeSoliderRed%5]])
                {
                    if(counter1==4)
                        break;
                    else
                    {
                        typeSoliderRed++;
                        counter1++;
                    }
                }
                if(redLife>=LifeTaken[redHome[typeSoliderRed%5]])
                    flag1=true;
                if(flag1==false)
                {

                    cout<<time<<" red headquarter stops making warriors"<<endl;
                    redLife=-1; //相当于break的作用,并且下次while循环也不会再执行red的步骤了
                }
                else
                {
                    cout<<time<<" "<<"red "<<redHome[typeSoliderRed%5];
                    cout<<" "<<cntRed<<" born with strength "<<LifeTaken[redHome[typeSoliderRed%5]]<<",";
                    cout<<++NumOfWarriorsRed[typeSoliderRed%5]<<" "<<redHome[typeSoliderRed%5];
                    cout<<" in red headquarter"<<endl;
                    redLife-=LifeTaken[redHome[typeSoliderRed%5]];
                    cntRed++;
                    typeSoliderRed++;
                }
            }
            //blue Headquarter
            if(blueLife>=0)
            {
                int counter2=0;
                bool flag2=false;
                while(blueLife<LifeTaken[blueHome[typeSoliderBlue%5]])
                {
                    if(counter2==4)
                        break;
                    else
                    {
                        typeSoliderBlue++;
                        counter2++;
                    }
                }
                if(blueLife>=LifeTaken[blueHome[typeSoliderBlue%5]])
                    flag2=true;
                if(flag2==false)
                {

                    cout<<time<<" blue headquarter stops making warriors"<<endl;
                    blueLife=-1; //相当于break的作用
                }
                else
                {
                    cout<<time<<" "<<"blue "<<blueHome[typeSoliderBlue%5];
                    cout<<" "<<cntBlue<<" born with strength "<<LifeTaken[blueHome[typeSoliderBlue%5]]<<",";
                    cout<<++NumOfWarriorsBlue[typeSoliderBlue%5]<<" "<<blueHome[typeSoliderBlue%5];
                    cout<<" in blue headquarter"<<endl;
                    blueLife-=LifeTaken[blueHome[typeSoliderBlue%5]];
                    cntBlue++;
                    typeSoliderBlue++;
                }
            }
            timeCoputer++;
        }
    }
}

string convert(int n) //将时间转换为三位字串
{
    string res="";
    int r;
    while(n!=0)
    {
        r=n%10;
        n/=10;
        res=char(r+'0')+res;
    }
    while(res.size()<3)
        res='0'+res;
    return res;
}

刚开始还以为是只要生命元不足于生产当前所需要生产的那个兵种所需的生命元,司令部就停止生产Warrior。。
仔细审了审题才明白,哦,原来是当前剩余的生命元不足于生产任何兵种,司令部才停止生产Warrior。。
加一个判断条件就ok。。
一说到Warriors,就想起来了金州勇士。。什么也不说了,勇士总冠军!!!
如果之后我搞明白了OOP编程的方式,我要再写一遍这个!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值