PKU MOOC作业魔兽世界之一:备战的结构化程序

原创 2016年06月02日 09:12:40

一不小心踏入PKU程序设计专项课程,没先听课就交钱加入。这门课,目的是培养程序员,从0基础,到程序设计员的培养,课程顺序是C语言-算法-数据结构,实际拆分为6+1门(毕业项目),理念不可谓不好。但是,效果了了。最大的问题,就是这门专项课程,很大部分都是学生自学,课堂互动性几乎为0,没有别的MOOC课程的答疑讨论,只有一些民间自行组织的QQ群。程序设计这东西,零基础入门还是有点勉强。天才是有,更多靠的是勤奋积累。君不见为了进谷歌等大型IT企业,多少人硬是把各种算法、数据结构背了个遍。
今天要说的是PKU这门课中的C++部分的大作业,魔兽世界的第一部分,据说其第三部分终结版非常之变态,代码2k行。这个第一部分,初看起来就觉得很复杂,下面给出题目。

描述

魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。

红司令部,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

光看到这一大片,很多人就不想看了。而同一部分作业,上一题是这样的

下面程序的输出是:
10
请补足Sample类的成员函数。不能增加成员变量。

#include <iostream>
using namespace std;
class Sample{
public:
    int v;
    Sample(int n):v(n) { }
// 在此处补充你的代码
};
int main() {
    Sample a(5);
    Sample b = a;
    cout << b.v;
    return 0;
}

这两题根本不是一个量级的,却放在了一起。说是这样,但是不做这一题还过不了,过不了钱就白交了。好吧。c++初学,类还掌握的皮毛,用最原始结构程序方法看能否解决。从输出入手,虽然程序的描述很复杂,但是输出挺简单的。主要有几点:

  • 第一点是输入的变量,这个很简单,其中有一点注意是要求要输入n组cases,之后要把所有用到的变量清零。
  • 第二点是有一个“时钟”,直接每次加1即可
  • 第三点是部队的颜色区别:红色、蓝色;5种战士;战士的编号,计数到生产结束为止;战士的数量。
  • 第四点比较坑爹,就是战士的“强度”怎么理解,后来看仔细检查发现所谓强度就等于战士初始的生命值。并且这个生命值输入的顺序,很红队,蓝队里的顺序三者完全不同
  • 第五点是循环判断,就是说如果当前生产不了,就顺延一位,如果到了队尾还得从头枚举,如果都不行,就停止生产。这里这个终止条件挺绕的,我还没总结出比较简洁完善的写法。

类是应该学好的,因为使用类结构的好处就是,程序方便修改和扩充。但是理解上还有编写上比较困难。结构化程序的好处是,小规模的程序很好理解和编写,缺点就是不好修改很扩充。下面是我写的魔兽备战结构化程序。

#include <iostream>
#include <iomanip>
using namespace std;
int count_red[5]={0};        /*实际每种生产的战士数量*/
int count_blu[5]={0};

int main()
{
    int C=0;       /*cases*/
    int M[2]={0};       /*生命元*/
    int HP[5]={0}; /*战士初始生命*/
    int clock=0;   /*时钟*/
    char color[2][5]={
        "red",
        "blue"
    };               /*军队颜色*/
    char soldier_red[5][8]={/*红队战士种类*/
        "iceman",
        "lion",
        "wolf",
        "ninja",
        "dragon"
    };
    int HP_red[5]={0};       /*真正的红队初始生命*/
    char soldier_blu[5][8]={/*蓝队战士种类*/
        "lion",
        "dragon",
        "ninja",
        "iceman",
        "wolf"
    };
    int HP_blu[5]={0};      /*真正的蓝队初始生命*/

    /*输入*/
    cin>>C;
    for(int j=0;j<C;j++){
        cin>>M[0];
        M[1]=M[0];           /*2队生命元*/
        for(int i=0;i<5;i++){
            cin>>HP[i];          /* dragon 、ninja、iceman、lion、wolf 的初始生命值*/
        }

        /*分配初始生命*/
        /*红队*/
        HP_red[0]=HP[2];
        HP_red[1]=HP[3];
        HP_red[2]=HP[4];
        HP_red[3]=HP[1];
        HP_red[4]=HP[0];
        /*蓝队*/
        HP_blu[0]=HP[3];
        HP_blu[1]=HP[0];
        HP_blu[2]=HP[1];
        HP_blu[3]=HP[2];
        HP_blu[4]=HP[4];

        /*begin红方司令部按照iceman、lion、wolf、ninja、dragon的顺序循环制造武士。

    蓝方司令部按照lion、dragon、ninja、iceman、wolf的顺序循环制造武士。*/
        int k=0;
        int pos1=0;       /*红战士定位*/
        int pos2=0;       /*蓝战士定位*/
        int flag_r=0;                        /*红队停止生产标志*/
        int flag_b=0;                        /*蓝队停止生产标志*/
        int loop_r=0;
        int loop_b=0;                         /*循环计数*/
        cout<<"Case:"<<j+1<<endl;
        while(1){
            if(M[0]==0&&flag_r==0){
                    cout<<setw(3)<<setfill('0')<<clock<<" ";
                    cout<<"red headquarter stops making warriors"<<endl;
                    flag_r=1;
            }
            if(M[0]>=0&&flag_r==0){
                if(pos1==5) pos1=0;                       /*按顺序回头生产*/
                M[0]=M[0]-HP_red[pos1];
                count_red[pos1]=count_red[pos1]+1;
            }
            loop_b=0;
            loop_r=0;
            while(M[0]<0&&flag_r==0){
                M[0]=M[0]+HP_red[pos1];
                pos1++;
                if(pos1==5) pos1=0;
                loop_r++;                                   /*试图制造下一个*/
                if(loop_r==5){
                    cout<<setw(3)<<setfill('0')<<clock<<" ";
                    cout<<"red headquarter stops making warriors"<<endl;
                    flag_r=1;
                    break;
                }
                M[0]=M[0]-HP_red[pos1];
                if(M[0]>=0&&flag_r==0)
                    count_red[pos1]=count_red[pos1]+1;
            }

            if(M[0]>=0&&flag_r==0){
                cout<<setw(3)<<setfill('0')<<clock<<" ";
                cout<<color[k]<<" "<<soldier_red[pos1]<<" "<<clock+1<<" "<<"born with strength "<<HP_red[pos1]<<","<<count_red[pos1]<<" "
                <<soldier_red[pos1]<<" in "<<color[k]<<" headquarter"<<endl;
                pos1++;
            }

            k++;
            if(M[1]==0&&flag_b==0){
                cout<<setw(3)<<setfill('0')<<clock<<" ";
                cout<<"blue headquarter stops making warriors"<<endl;
                break;
            }
            if(M[1]>=0&&flag_b==0){
                if(pos2==5) pos2=0;                       /*按顺序回头生产*/
                M[1]=M[1]-HP_blu[pos2];
                count_blu[pos2]=count_blu[pos2]+1;
            }
            while(M[1]<0&&flag_b==0){
                M[1]=M[1]+HP_blu[pos2];
                pos2++;
                if(pos2==5) pos2=0;
                loop_b++;
                if(loop_b==5)   {
                    cout<<setw(3)<<setfill('0')<<clock<<" ";
                    cout<<"blue headquarter stops making warriors"<<endl;      /*如果无可制造,退出*/
                    flag_b=1;
                    break;
                }
                M[1]=M[1]-HP_blu[pos2];
                if(M[1]>=0&&flag_b==0)
                    count_blu[pos2]=count_blu[pos2]+1;
            }
            if(M[1]>=0&&flag_b==0){
                cout<<setw(3)<<setfill('0')<<clock<<" ";
                cout<<color[k]<<" "<<soldier_blu[pos2]<<" "<<clock+1<<" "<<"born with strength "<<HP_blu[pos2]<<","<<count_blu[pos2]<<" "
                <<soldier_blu[pos2]<<" in "<<color[k]<<" headquarter"<<endl;
                pos2++;
            }
            clock++;
            k=0;
            if(flag_b==1&&flag_r==1)    break;
        }
        clock=0;
        for(int i=0;i<5;i++){
            count_red[i]=0;        /*清零*/
            count_blu[i]=0;
        }
    }

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

北大程序设计实习公开课编程作业,魔兽世界之二:装备

魔兽世界的第二个版本,装备。相较于版本一,武士已经不能直接用两个全局数据保存名称和初始生命值就可以搞定了。 这里先分析一下题目。武士有5个种类,每种都有自己的特征,但他们共有的特征是有名字和生命元这...

魔兽世界之一:备战

总时间限制: 1000ms 内存限制: 65536kB 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。  红司令部,City 1,C...

魔兽世界之一备战

#include #include #include #include #include using namespace std; int dHP, iHP, lHP, nHP, wHP...

【自学C++】魔兽世界之一:备战

学校的C++讲的实在太扯,于是ji

[土狗之路]Coursera 北京大学C++ 魔兽世界:备战

这个是有错误的,测试案例可以通过,但是如果power给的数据大了则会崩溃,发上来是求路过的各位大侠帮忙指出错误! 题目在下面: 编程题#4:魔兽世界之一:备战 来源: POJ (Courser...

魔兽世界之一:备战-解题报告

魔兽世界之一:备战 cxsjsx.openjudge.com 描述魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。 红司令部,City 1,City 2,……...

程设作业:魔兽世界2:装备

直接贴代码: #include #include #include #include using namespace std; const char TIME_FILL = '0'; c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)