描述
魔獸世界的西面是紅魔軍的司令部,東面是藍魔軍的司令部,兩個司令部之間是依次排列的若干城市,
紅司令部,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 <= 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
分析:
- 首先是寫兩個類(司令部、武士),然后創建兩個司令部物件(red&blue),十個武士物件(分兩個武士類陣列,方便后面操作)
- 司令部的成員資料包括:名字、生命元、編號,成員函式包括:修改生命元、創建武士、減少生命元、show生命元以及一個靜態變數時間,
- 武士的成員資料包括:種類、生命、存在個數,成員函式包括:設定生命;以及一個來自司令部類的友元函式(可以訪問武士的private)
- 創建武士函式:設其回傳值為int(不設為bool,因為我們需要三個狀態:0——武士創建成功;1——結束創建武士;2——此武士創建不了,創建下一個武士)
- 首先判斷生命元與當前武士生命值大小,如果生命元更大,則創建武士(存在個數++,生命元- -,列印,編號++),return 0;
- 如果生命元更小,接著判斷生命元是否小于最小武士生命值,如果是,則列印結束語,return1
- 否則,return 2,創建下一個武士
- 主程式:
- 因為有多個cases,所以類物件創立寫在cases回圈體里,這樣每一次cases類物件都會構造、析構,相當于格式化了,
- 創建兩個武士陣列,每個陣列按生命值分配順序寫入,然后修改武士生命值,然后再搭建兩個陣列,分別是red和blue的武士創建順序的序號,對應于前面的物件陣列,然后開始create soilders, 利用多個tag來判斷何時結束回圈即可,
下圖為額外輸入資料測驗:

代碼:
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int Min;
class soilder;
class headq
{
private:
int life_s; //生命元
string name; //司令部
int num; //編號
public:
static int time; //時間
void modify(int n); //修改生命元
int create(soilder* p); //創建武士
void substract(int n){ life_s -= n;}//減少生命元
int lifes_show(){return life_s;} //show生命元
headq(string name1="no",int n=0,int j=1):life_s(n),name(name1),num(j){}
};
class soilder
{
private:
int life; //生命
string species; //種類
int exit; //存在個數
public:
friend int headq::create(soilder* p);
soilder(string s="no",int n=0,int j=0):life(n),species(s),exit(0){}
void edit(int n){life = n;} //設定生命
};
int headq::time =0;
void headq::modify(int n)
{
life_s = n;
}
int headq::create(soilder* p)
{
if(life_s>= p->life)
{
p->exit++;
substract(p->life);
cout<<setfill('0')<<setw(3)<<time<<" "<<name<<" "<<p->species<<" "
<<num<<" born with strength "<<p->life<<","<<p->exit
<<" "<<p->species<<" in "<<name<<" headquarter\n";
num++;
return 0;
}
if(life_s<Min)
{
cout<<setfill('0')<<setw(3)<<time<<" "<<name<<
" headquarter stops making warriors\n";
return 1;}
if(life_s<p->life)
return 2;
}
int main()
{
int n,i;
cin>>n;
for(i=1;i<=n;i++)
{
Min=999999;
headq::time=0;
soilder m1("dragon"),m2("ninja"),m3("iceman"),m4("lion"),m5("wolf");
soilder m6("dragon"),m7("ninja"),m8("iceman"),m9("lion"),m10("wolf");
soilder m_r[5]={m1,m2,m3,m4,m5};
soilder m_b[5]={m6,m7,m8,m9,m10};
headq r("red"),b("blue");
int tag=0;
cout<<"Case:"<<i<<endl;
int temp1;
cin>>temp1; //生命元
r.modify(temp1) ;
b.modify(temp1) ;
for(int j=0;j<5;j++) //修改生命值
{
int temp2;
cin>>temp2;
if(temp2<Min)
Min=temp2;
m_r[j].edit(temp2);
m_b[j].edit(temp2);
}
int j=0,k=0;
int time_r[5]={2,3,4,1,0}; //武士創建順序
int time_b[5]={3,0,1,2,4};
int p1=1,p2=1;
//創建武士程序
while(tag!=2) //tag==2則兩個司令部停止
{
while(p1)
{
int temp3 = r.create(&m_r[time_r[j]]); //temp3為創建武士回傳的狀態值
if(temp3==0)
{ j++;
break;}
else if(temp3==2)
{
j++;
if(j==5)
j=0;
continue;
}
else if(temp3==1)
{
p1=0;tag++;
}
}
while(p2)
{
int temp3 = b.create(&m_b[time_b[k]]);
if(temp3==0)
{
k++;
break;
}
else if(temp3==2)
{
k++;
if(k==5)
k=0;
continue;
}
else if(temp3==1)
{
p2=0;
tag++;
}
}
headq::time++;
if(j==5)
j=0;
if(k==5)
k=0;
}
}
}
- 關于整型或浮點型擴展,相關閱讀:C++整型或浮點型擴展
- 這是前三周所學知識的運用,沒有用太難的其他知識,
- 值得回味的點:
①先創建class soilder宣告,在創建class headq宣告,然后寫一個函式引數為soilder指標,在soilder類中宣告為其友元函式,可以訪問private
②分清哪些是共用的資料,設定為static(一般寫在public中,不然得用靜態成員函式訪問)
③整型擴展
④多種情況的,利用return 0、1、2等來進一步討論
⑤可以創建多個物件而不是創建一半物件(比如創建2個dragon、nanja等),這樣可以減少你的思考時間,
⑥將物件生成寫在塊中,實作格式化
結果


我的代碼是最短的,哈哈哈開心,這是我第一遍寫代碼,還沒有進行優化,有什么建議的可以提出來,脖子疼,不優化了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/44628.html
標籤:其他
上一篇:遇見 vue.js --------阿文的vue.js學習筆記(2—1)----- 基本使用 [1]
下一篇:[ZJOI2007]矩陣游戲
