#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;}