不知不觉好久没写博客,怠惰惹
#include<bits/stdc++.h>
using namespace std;
#define stop system("pause")
//0 dragon,1 ninja,2 iceman,3 lion,4 wolf
const int MAXN=1111;//每个总部最多能有多少武士
const int WNUM=5;//一共有多少种武士
class Head;
class Warrior//武士
{
private:
int kind;//类型
int cnt;//该武士编号
Head *phead;//属于哪个总部
public:
Warrior(Head *pp,int kk,int cc):phead(pp),kind(kk),cnt(cc){};
void print(int ntime);
static string name[WNUM];//每种武士的姓名
static int initlf[WNUM];//每种武士初始生命值
};
class Head//总部
{
private:
bool stopped;//是否已经停止
int color;//红蓝总部
int cur;//当前该造第几个(并不是直接的编号)
int totlf;//总生命源
int totnum;// 总武士数
int warnum[WNUM];//该司令部每种武士有多少个
Warrior *p[MAXN];//武士们
public:
friend class Warrior;//方便武士输出时访问私有成员
static int fun[2][WNUM];//武士制造序列
void init(int tag,int inittotlf);
~Head(){for(int i=0;i<totnum;++i) delete p[i];}
string getcolor()
{
if(color==0) return "red";
if(color==1) return "blue";
}
int produce(int nTime);
};
void Warrior::print(int ntime)
{
string color= phead->getcolor();
printf("%03d %s %s %d born with strength %d,%d %s in %s headquarter\n",
ntime, color.c_str(), name[kind].c_str(),cnt,initlf[kind],
phead->warnum[kind],name[kind].c_str(),color.c_str());
}
void Head::init(int tag,int inittotlf)
{
for(int i=0;i<WNUM;++i) warnum[i]=0;
color=tag,totlf=inittotlf,cur=totnum=0,stopped=false;
}
int Head::produce(int ntime)
{
if(stopped) return 0;
int searchtime=0;
while(Warrior::initlf[fun[color][cur]]>totlf&&searchtime<WNUM)
cur=(cur+1)%WNUM,searchtime++;
int kindnow=fun[color][cur];
if(Warrior::initlf[kindnow]>totlf)//找不到可以建造的士兵
{
stopped=true;
if(color==0)
printf("%03d red headquarter stops making warriors\n",ntime);
if(color==1)
printf("%03d blue headquarter stops making warriors\n",ntime);
return 0;
}
//建造士兵
totlf-=Warrior::initlf[kindnow];
cur=(cur+1)%WNUM;//记得更新要建造的序列号呀
p[totnum]=new Warrior(this,kindnow,totnum+1);
warnum[kindnow]++;
p[totnum]->print(ntime);
totnum++;
return 1;
}
int Warrior::initlf[WNUM];
int Head::fun[2][WNUM]={ { 2,3,4,1,0 },{3,0,1,2,4} };
string Warrior::name[WNUM]={"dragon","ninja","iceman","lion","wolf"};//武士姓名
int main()
{
int t;cin>>t;
Head R,B;
int ncase=0;
while(t--)
{
printf("Case:%d\n",++ncase);
int m;cin>>m;
for(int i=0;i<WNUM;++i)
cin>>Warrior::initlf[i];
R.init(0,m);B.init(1,m);
for(int ntime=0;;++ntime)
{
int tmp1=R.produce(ntime);
int tmp2=B.produce(ntime);
if(!tmp1&&!tmp2) break;
}
}
stop;
return 0;
}
/*
原题链接:http://cxsjsxmooc.openjudge.cn/2019t3summerall/013/
每一个总部拥有多个武士,每一个武士属于一个总部
考虑“人狗模型”,应该为这两个类建立复合关系(互相“知道”)
尽量让与类相关的信息包含在类中
比如总部名字与武士名字,总部建立武士顺序
为每一个操作找到一个合适的类,建立武士是总部完成的就把produce函数放在总部类里
输出相关信息的时候输出的是武士信息所以print放在武士类里,
同时为了方便武士输出时访问总部,将武士声明为总部友元类
*/ 
京公网安备 11010502036488号