不知不觉好久没写博客,怠惰惹
#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放在武士类里,
	同时为了方便武士输出时访问总部,将武士声明为总部友元类
*/