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