POJ3760 (百练3750) 代码

    技术2022-05-19  19

    #define SONA_DEBUG

    ////////                          /////     魔兽世界(修订版)   /////     POJ3760 百练3750     /////     2011.3.3 18:45      /////       Copyright 2011     ///// EECS , Peking University /////        Sona Tithew       /////        With  Teresa      /////                          /////////

     

     

    #include <iostream>#include <cstdio>#include <algorithm>#include <cstring>

     

    using namespace std;

    ////// 常量声明开始 /////

     

    //基地颜色

    const int NONE = 0;const int RED  = 1;const int BLUE = 2;

    //

    //武士种类

    const int DRAGON = 0;const int NINJA  = 1;const int ICEMAN = 2;const int LION   = 3;const int WOLF   = 4;

    //

    //输出信息类型

    const int BORN   = 1;const int MARCH  = 2;const int ATTACK = 3;const int FBACK  = 4;const int DEATH  = 5;const int YELL   = 6;const int GETELE = 7;const int FLAGUP = 8;const int ARRIVE = 9;const int TAKEN  = 10;const int REPORT = 11;

    //

    //预设的各基地出兵顺序

    const int ORDER[3][5] = { {},{ICEMAN,LION,WOLF,NINJA,DRAGON} , {LION,DRAGON,NINJA,ICEMAN,WOLF} };

    //

    ////// 常量声明结束 /////

     

     

    //// 全局变量声明开始 ///

     

    int army_element[5];               //每个武士初始生命元int army_force[5];                //每个武士初始攻击力int init_element;                //每个基地初始生命元int length;                  //城市个数1..lengt(0表示红方基地,length+1表示蓝方基地)int timelimit;                 //输出的时间限制bool endflag;                 //有基地被占领,结束标记

     

    //// 全局变量声明结束 ///

     

    /// 时钟类开始 ////////主要完成对于总引擎时间的控制

     

    class Myclock{

    public:

     int hour,minute;               //小时,分钟

    public:

     Myclock()                 //初始化时钟为0 {  hour = minute = 0; }

     void Next(void)                //时钟往后拨十分钟 {  minute += 10;  if (minute == 60)  {   minute = 0;   hour++;  } }

     int Minute(void)               //获取总分钟数信息(用于判断结束) {  return hour*60+minute; }

     void Print(void)               //按标准输出时间 {  printf("d:d",hour,minute); }

    }*myclock;

     

    /// 时钟类结束 //////

     

    /// 输出类开始 ////////主要完成对于指定类型和一个int数组输入参数指定的输出信息输出

     

    class Output{

    private: 

     char colorname[3][5];              //颜色名称 char armyname[6][8];              //武士名称

    public:

     Output()                 //初始化颜色名称和武士名称 {  strcpy(colorname[RED],"red");  strcpy(colorname[BLUE],"blue");  strcpy(armyname[DRAGON],"dragon");  strcpy(armyname[NINJA],"ninja");  strcpy(armyname[ICEMAN],"iceman");  strcpy(armyname[LION],"lion");  strcpy(armyname[WOLF],"wolf"); }

     void Print(int printtype , int *input)          //按照输出类型,以及数据数组,向外输出 {  myclock->Print();              //首先输出时间

      switch(printtype)  {  case   BORN:printf(" %s %s %d born/n",colorname[input[0]],armyname[input[1]],input[2]);break;  case  MARCH:printf(" %s %s %d marched to city %d with %d elements and force %d/n",colorname[input[0]],armyname[input[1]],input[2],input[3],input[4],input[5]);break;  case ATTACK:printf(" %s %s %d attacked %s %s %d in city %d with %d elements and force %d/n",colorname[input[0]],armyname[input[1]],input[2],colorname[input[3]],armyname[input[4]],input[5],input[6],input[7],input[8]);break;  case  FBACK:printf(" %s %s %d fought back against %s %s %d in city %d/n",colorname[input[0]],armyname[input[1]],input[2],colorname[input[3]],armyname[input[4]],input[5],input[6]);break;  case  DEATH:printf(" %s %s %d was killed in city %d/n",colorname[input[0]],armyname[input[1]],input[2],input[3]);break;  case   YELL:printf(" %s %s %d yelled in city %d/n",colorname[input[0]],armyname[input[1]],input[2],input[3]);break;  case GETELE:printf(" %s %s %d earned %d elements for his headquarter/n",colorname[input[0]],armyname[input[1]],input[2],input[3]);break;  case FLAGUP:printf(" %s flag raised in city %d/n",colorname[input[0]],input[1]);break;  case ARRIVE:printf(" %s %s %d reached %s headquarter with %d elements and force %d/n",colorname[input[0]],armyname[input[1]],input[2],colorname[input[3]],input[4],input[5]);break;  case  TAKEN:printf(" %s headquarter was taken/n",colorname[input[0]]);break;  case REPORT:printf(" %d elements in %s headquarter/n",input[0],colorname[input[1]]);break;  }

     }}*output;

     

    /// 输出类结束 //////

     

    /// 输入类开始 ////////主要完成将一些int数据整合成一个int数组

     

    class Input {private:

     int *a;                  

    public:

     Input() {  a = new int[9];               //不超过9个数据 }

     int *arr(int i0,int i1=0,int i2=0,int i3=0,int i4=0,int i5=0,int i6=0,int i7=0,int i8=0) {                   //将输入数据封装在一个int数组内  a[0]=i0;a[1]=i1;a[2]=i2;a[3]=i3;a[4]=i4;a[5]=i5;a[6]=i6;a[7]=i7;a[8]=i8;  return a; }

     ~Input()                 //回收内存 {  delete[] a; }};

     

    /// 输入类结束 //////

    //预先声明武士类

    class Army;       

    //

    ///// 基地类声明开始 ////

     

    class Battle{public:

     int color; int element; int award; int pro; int number;

     Input input;

    public:

     Battle(); void Born(void);

    }*battle;             //battle[3]

     

    ///// 基地类声明结束 ////

     

    ///// 城市类声明开始 ////

    class City{

    public:

     int number; int flagcolor; int lastwin; int element;

     Army *army[3];

     Army *tempRED;

     Input input;

    public:

     City();                void Produce(void); void Give(void); void Fight(void); void ChangeFlag(int color,City *city);

    }*city;              //city[0..length+1]

    ///// 城市类声明结束 ////

     

    ///// 武士类声明开始 ////

     

    class Army{

    private: 

    public:

     int color; int type; int number; int element; int force; int lastwin;                //Only for WOLF int step;                 //Only for ICEMAN int position;

     bool win; bool alive;

     bool marched;                //Only for RED ARMY

    public:

     Army(int color_,int type_,int number_,int position_); void Change(Army *e,int ele,bool iffirst); void Fight(Army *e,City *city); void March(void);};

    ///// 武士类声明结束 ////

     

    ///// 武士类实现开始 //////主要完成武士的初始化,战斗属性变化,武士进攻与反击细节,武士前进细节等

     

    Army::Army(int color_,int type_,int number_,int position_)      //初始化颜色,种类,标号,位置,属性等{ color = color_; type = type_; number = number_; element = army_element[type]; force = army_force[type]; lastwin = 0; step = 0; position = position_;

     win = false; alive = true; marched = false;

    }

    void Army::Change(Army *e,int ele,bool iffirst)         //发生击杀时的属性变换{ if (type == WOLF&&iffirst)             //是WOLF主动攻击 {  if (lastwin)               //偶数次  {    force *= 2;               //WOLF 武士技能 偶数加倍 被触发   element *= 2;   lastwin = 0;  }  else   lastwin = 1;              //奇数次 }

     if (e->type == LION)              //LION被击杀 {  element += ele;               //LION 武士技能 被杀送血 被触发 }

    }

    void Army::Fight(Army *e,City *city)           //this武士与e武士在City战斗{ Input input; int ele;                    //this武士主动攻击 output->Print(ATTACK,input.arr(color,type,number,e->color,e->type,e->number,city->number,element,force));

     ele = e->element;               //记录e武士生命值 e->element -= force;              //e武士受到伤害

     if (e->element<=0)               //e武士死亡 {  e->alive = false;  win = true;  output->Print(DEATH,input.arr(e->color,e->type,e->number,city->number));

      if (type == DRAGON)              //如果this是DRAGON武士   output->Print(YELL,input.arr(color,type,number,city->number));  //DRAGON 武士技能 活命欢呼 被触发

      Change(e,ele,true);              //this武士属性修改

      if (city->element)              //this武士为基地获取生命元  {   output->Print(GETELE,input.arr(color,type,number,city->element));   battle[color].award += city->element;   city->element = 0;  }

      if ( city->lastwin == color )           //城市连胜判断   city->ChangeFlag(color,city);          //变更旗帜  else   city->lastwin = color;            //保存该城市上次战斗是this武士颜色方胜利

     } else if (e->type != NINJA) {                   //反击!!!!  output->Print(FBACK,input.arr(e->color,e->type,e->number,color,type,number,city->number));     ele = element;               //保存this武士生命值  element -= e->force/2;             //this武士受到伤害

      if (element <= 0)  {   alive = false;              //this武士死亡   e->win = true;   output->Print(DEATH,input.arr(color,type,number,city->number));

       e->Change(this,ele,false);           //e武士属性修改

       if (city->element)             //e武士为基地获取生命元   {    output->Print(GETELE,input.arr(e->color,e->type,e->number,city->element));    battle[e->color].award += city->element;    city->element = 0;   }

       if ( city->lastwin == e->color )         //城市连胜判断    city->ChangeFlag(e->color,city);        //变更旗帜   else    city->lastwin = e->color;          //保存该城市上次战斗是e武士颜色方胜利

      }

      else                 //都没挂

      {

      if (type == DRAGON)              //DRAGON 武士技能 活命欢呼 被触发   output->Print(6,input.arr(color,type,number,city->number));     city->lastwin = NONE;             //保存保存该城市上次战斗谁都没胜利

      } } else                  //NINJA 武士技能 永不反击 被触发 {  if (type == DRAGON)              //DRAGON 武士技能 活命欢呼 被触发   output->Print(6,input.arr(color,type,number,city->number));  city->lastwin = NONE;             //保存保存该城市上次战斗谁都没胜利 }}

    void Army::March(void)               //武士前进{

     Input input;

     if (color == RED)               //红色武士 {  if(position==length+1)             //已经到达蓝方基地,无所事事   return;     if (type == ICEMAN)              //ICEMAN 武士技能 掉血加倍 被触发  {   if (step)   {    element = max(element-9,1);    force += 20;    step = 0;   }   else    step = 1;  }

      if (position==length)             //将要到达蓝方基地  {   output->Print(ARRIVE,input.arr(RED,type,number,BLUE,element,force));   if (city[length+1].army[RED])          //已有其他红色武士到达蓝方基地   {    endflag = true;    output->Print(TAKEN,input.arr(BLUE));       //蓝方基地被占领   }  }  else  {   output->Print(MARCH,input.arr(RED,type,number,city[position+1].number,element,force));  }

      city[position].army[RED] = NULL;          //走出原来的城市  if (city[position].tempRED)            //如果有待走入的红色武士  {   city[position].army[RED] = city[position].tempRED;     //引入   city[position].tempRED = NULL;  }

      if (city[position+1].army[RED]==NULL)         //下一个城市没有红色武士   city[position+1].army[RED] = this;         //走入  else   city[position+1].tempRED = this;         //成为待走入武士

      position++;

      marched = true; } else {  if(position==0)               //已经到达红方基地,无所事事   return;     if (type == ICEMAN)              //ICEMAN 武士技能 掉血加倍 被触发  {   if (step)   {    element = max(element-9,1);    force += 20;    step = 0;   }   else    step = 1;  }

      if (position==1)              //将要到达红方基地  {   output->Print(ARRIVE,input.arr(BLUE,type,number,RED,element,force));   if (city[0].army[BLUE])            //已有其他蓝方武士到达红方基地   {    endflag = true;     output->Print(TAKEN,input.arr(RED));       //红方基地被占领   }  }  else  {   output->Print(MARCH,input.arr(BLUE,type,number,city[position-1].number,element,force));  }

      city[position].army[BLUE] = NULL;          //走出  city[position-1].army[BLUE] = this;          //走入  position--; }}

    ///// 武士类实现完成 ////

     

    ///// 城市类实现开始 //////主要完成城市的初始化,生命元产生和获取,武士战斗的攻守顺序,旗帜更改等

     

    City::City()                 //旗帜,上一次胜利,待入武士均清空{ number = 0; flagcolor = NONE; lastwin = NONE; element = 0; army[RED] = army[BLUE] = NULL; tempRED = NULL;}

    void City::Produce(void)              //城市产生生命元{ element += 10;}

    void City::Give()                //城市给予单独存在的武士生命元{ if (!element)  return; if (army[RED]&&!army[BLUE]) {  output->Print(GETELE,input.arr(RED,army[RED]->type,army[RED]->number,element));  battle[RED].element+=element;  element=0; } if (army[BLUE]&&!army[RED]) {  output->Print(GETELE,input.arr(BLUE,army[BLUE]->type,army[BLUE]->number,element));  battle[BLUE].element+=element;  element=0; }}

    void City::Fight(void)               //城市发生战争{ if (army[RED] && army[BLUE]) {  if (flagcolor == RED || flagcolor == NONE && number%2 )     //判断谁主动进攻   army[RED]->Fight(army[BLUE],this);  else   army[BLUE]->Fight(army[RED],this);

      if (army[RED]->alive == false)           //红方武士死亡  {   delete army[RED];   army[RED] = NULL;  }  if (army[BLUE]->alive == false)           //蓝方武士死亡  {   delete army[BLUE];   army[BLUE] = NULL;  } }

    }

    void City::ChangeFlag(int color,City *city)          //城市存在连胜,旗帜可能改变{ if (flagcolor != color)              //旗帜需要改变 {  output->Print(FLAGUP,input.arr(color,city->number));  flagcolor = color;  }}

     

    ///// 城市类实现结束 ////

     

    ///// 基地类实现开始 //////主要完成武士降生,基地的生命元保存等

     

    Battle::Battle()                //基地初始化{ element = init_element; color = NONE; award = 0; pro = 0; number = 1;}

    void Battle::Born(void)               //兵团降生武士{ if (element<army_element[ORDER[color][pro]])        //生命元不够  return;;

     element-=army_element[ORDER[color][pro]];         output->Print(BORN,input.arr(color,ORDER[color][pro],number)); if (color == RED)               //按照造兵顺序生产武士  city[0].army[RED] = new Army(color,ORDER[color][pro],number++,0); else  city[length+1].army[BLUE] = new Army(color,ORDER[color][pro],number++,length+1); pro = ( pro + 1 ) % 5;              //造兵顺序指针后移} 

     

    ///// 基地类实现结束 ////

     

    /////  总引擎类开始  //////主要完成整个模拟系统引擎,初始化,武士按照目的地从西向东输出前进信息,战斗后武士和基地的生命元交互,基地生命元报告,总引擎随时间工作

     

    class Engine{public:

     Input input;

    public:

     Engine() {  if (myclock)   delete myclock;  if (output)   delete output;  if (city)   delete[] city;  if (battle)   delete[] battle; }

     ~Engine() {  if (myclock)   delete myclock;  if (output)   delete output;  if (city)   delete[] city;  if (battle)   delete[] battle; }

     void Init(void)                //总引擎初始化 {

      scanf("%d%d%d",&init_element,&length,&timelimit);    scanf("%d%d%d%d%d",army_element+DRAGON,army_element+NINJA,army_element+ICEMAN,army_element+LION,army_element+WOLF);  scanf("%d%d%d%d%d",army_force+DRAGON,army_force+NINJA,army_force+ICEMAN,army_force+LION,army_force+WOLF);

      endflag = false;

      if (myclock)   delete myclock;  myclock = new Myclock;  if (output)   delete output;  output = new Output;  if (city)   delete[] city;  city = new City[length+2];  for(int i=0;i<length+2;i++)   city[i].number = i;  if (battle)   delete[] battle;  battle = new Battle[3];

      battle[RED].color = RED;  battle[BLUE].color = BLUE;   }

     void Born(void)                //武士降生 {  battle[RED].Born();  battle[BLUE].Born(); }

     void March(void)               //武士前进(按照目的地从东到西顺序) {  int i;  for(i=0;i<length+2;i++)  {  if ( city[i].army[RED] )  {   city[i].army[RED]->marched = false;   city[i].tempRED = NULL;  }  }  for(i=0;i<length+2;i++)  {   if (i!=0 && city[i-1].army[RED] )    if (!city[i-1].army[RED]->marched==true)     city[i-1].army[RED]->March();   if (i!=length+1 && city[i+1].army[BLUE])    city[i+1].army[BLUE]->March();  } }

     void Fight(void)               //武士战斗 {  int i;

      for(i=1;i<=length;i++)   city[i].Fight();

      //基地先发送奖励给武士的生命元,再回收武士赢得的生命元

      //优先奖励距离地方基地更近的武士

      for(i=length;i>=1;i--)               {   if (city[i].army[RED] && city[i].army[RED]->win)   {    if (battle[RED].element>=8)          //生命值足够8才奖励,否则不奖励    {     city[i].army[RED]->element += 8;     battle[RED].element -= 8;    }    city[i].army[RED]->win = false;   }  }

      for(i=1;i<=length;i++)  {   if (city[i].army[BLUE] && city[i].army[BLUE]->win)   {    if (battle[BLUE].element>=8)    {     city[i].army[BLUE]->element += 8;     battle[BLUE].element -= 8;    }    city[i].army[BLUE]->win = false;   }  }

      battle[RED].element += battle[RED].award;        //基地回收奖励  battle[RED].award = 0;  battle[BLUE].element += battle[BLUE].award;  battle[BLUE].award = 0;

     }

     void Produce(void)               //城市产生生命元 {  int i;  for(i=1;i<=length;i++)   city[i].Produce(); }

     void Give(void)                //城市给予单独存在的武士生命元 {  int i;  for(i=1;i<=length;i++)   city[i].Give(); }

     void Report(void)               //基地报告 {  output->Print(REPORT,input.arr(battle[RED].element,RED));  output->Print(REPORT,input.arr(battle[BLUE].element,BLUE)); }

     void Solve(void)               //按照时钟模拟 {  while(!endflag && myclock->Minute()<=timelimit)       //没有基地被占领且时间未超过先知  {   switch(myclock->minute)   {

       case  0:Born();break;            //00分武士降生   case 10:March();break;            //10分武士前进   case 20:Produce();break;           //20分城市产生生命元   case 30:Give();break;            //30分城市给予单独存在的武士生命元   case 40:Fight();break;            //40分双方武士都存在的城市发生战斗   case 50:Report();break;            //50分基地报告生命元存量

       }

       myclock->Next();             //时钟后移  } }}engine;

     

    /////  总引擎类结束  ////

     

     

     

    int main(){ int testcase,i; scanf("%d",&testcase); freopen("output.txt","w",stdout); for(i=1;i<=testcase;i++) {  printf("Case:%d/n",i);  engine.Init();  engine.Solve(); } return 0;}


    最新回复(0)