C++程序设计-魔兽终极版

编程题#4: 魔兽世界终极版
注意: 总时间限制: 2000ms 内存限制: 65536kB

AC
(题干略)

#include
#include
#include
#include
#include
using namespace std;

class Headquarter {
public:
	Headquarter() { cityawardr = 0; cityawardb = 0; redtob = 0; bluetor = 0; }
	int Mr, Mb, cityawardr, cityawardb, redtob, bluetor;
};

class warrior {
public:
	warrior() {
		info.step = 0; info.loyalty = 0; info.sword = 0; info.arrow = 0; info.bomb = 0; info.sq = 0.00;
	}
	struct Info{
		int force, life, step, loyalty, sword, arrow, bomb;
		double sq;
		string name;
	};
	int n;
	Info info;
};

class Binfo {
public:
	int life, force;
};

class city {
public:
	city() { info.life = 0; info.red = 0, info.blue = 0, info.flagr = 0, info.flagb = 0; info.flag = '0'; }
	struct Info {
		int life, red, blue, flagr, flagb;
		char flag;
	};
	int n;
	Info info;
};

typedef map<int, warrior::Info> MAP;
typedef map<int, city::Info> CITY;

int main() {
	int caseN; cin >> caseN; int ii = 0; if (caseN == 0) { return 0; }
	while (ii < caseN) {
		++ii;
		cout << "Case " << ii << ":" << endl;
		int M, N, R, K, T; cin >> M >> N >> R >> K >> T; //life/city/arrow force/loyalty/time
	
		if (T >= 0) {
			Headquarter a; a.Mr = a.Mb = M;
			int life[5] = { 0 }; int force[5] = { 0 }; string name[5] = { "dragon", "ninja", "iceman", "lion", "wolf" }; 
			for (int j = 0; j < 5; ++j) { cin >> life[j]; } for (int j = 0; j < 5; ++j) { cin >> force[j]; }

			map<string, Binfo> mname; for (int j = 0; j < 5; ++j) {
				Binfo info; info.force = force[j]; info.life = life[j]; mname.insert(make_pair(name[j], info)); 
			}

			MAP mr; MAP mb; MAP::iterator i; MAP::iterator temp;//insert warriors in map
			int min = 0; int hour = 0; warrior redw; warrior bluew;
			CITY acity; CITY::iterator icity; city aacity;
			for (int j = 0; j < N; ++j) { acity.insert(make_pair(j + 1, aacity.info)); } //initiate city
			string redname[5] = { "iceman", "lion", "wolf", "ninja", "dragon" }; string bluename[5] = { "lion", "dragon", "ninja", "iceman", "wolf" }; //order to make warrior
			int jr = 0, jb = 0, nr = 0, nb = 0;  //index of array/sum of warriors

			while (T >= 0) {
				if (min == 0) {   // make warriors
					if (jr == 5) { jr = 0; }  //jr is the index of array / nr is used as count
					map<string, Binfo>::iterator ir = mname.find(redname[jr]); //redheadquarter
					if (a.Mr >= ir->second.life) { //if it is enough to make warrior
						++nr;
						redw.info.life = ir->second.life; redw.info.force = ir->second.force; redw.n = nr; a.Mr -= ir->second.life;
						redw.info.step = 0; redw.info.loyalty = 0; redw.info.sword = 0; redw.info.arrow = 0; redw.info.bomb = 0; redw.info.sq = 0.00;
						if (redname[jr] == "iceman" || redname[jr] == "dragon" || redname[jr] == "ninja") { //they born with weapon
							if (nr % 3 == 0) { redw.info.sword = (int)(0.2*redw.info.force); }
							else if (nr % 3 == 1) { redw.info.bomb = 1; }
							else if (nr % 3 == 2) { redw.info.arrow = 3; }
							if (redname[jr] == "ninja") {
								redw.info.name = "ninja"; //ninja born with 2 weapons
								if ((nr + 1) % 3 == 0) { redw.info.sword = (int)(0.2*redw.info.force); }
								else if ((nr + 1) % 3 == 1) { redw.info.bomb = 1; }
								else if ((nr + 1) % 3 == 2) { redw.info.arrow = 3; }
								cout << setfill('0') << setw(3) << hour << ":00 red ninja " << nr << " born" << endl;
							}
							else if (redname[jr] == "iceman") {
								redw.info.name = "iceman";
								cout << setfill('0') << setw(3) << hour << ":00 red iceman " << nr << " born" << endl;
							}
							else if (redname[jr] == "dragon") { //dragon born with morale
								redw.info.name = "dragon"; redw.info.sq = (double)a.Mr / (double)redw.info.life;
								cout << setfill('0') << setw(3) << hour << ":00 red dragon " << nr << " born" << endl;
								cout << "Its morale is " << fixed<<setprecision(2)<<redw.info.sq << endl;
							}
						}
						else if (redname[jr] == "lion") { //lion born with morale
							redw.info.name = "lion"; redw.info.loyalty = a.Mr;
							cout << setfill('0') << setw(3) << hour << ":00 red lion " << nr << " born" << endl;
							cout << "Its loyalty is " << redw.info.loyalty << endl;
						}
						else if (redname[jr] == "wolf") {
							redw.info.name = "wolf";
							cout << setfill('0') << setw(3) << hour << ":00 red wolf " << nr << " born" << endl;
						}
						mr.insert(make_pair(redw.n, redw.info)); ++jr;  //insert warriors in map
					}

					if (jb == 5) { jb = 0; } 
					map<string, Binfo>::iterator ib = mname.find(bluename[jb]); 
					if (a.Mb >= ib->second.life) { //blueheadquarter
						++nb;
						bluew.info.life = ib->second.life; bluew.info.force = ib->second.force; bluew.n = nb; a.Mb -= ib->second.life;
						bluew.info.step = 0; bluew.info.loyalty = 0; bluew.info.sword = 0; bluew.info.arrow = 0; bluew.info.bomb = 0; bluew.info.sq = 0.00;
						if (bluename[jb] == "iceman" || bluename[jb] == "dragon" || bluename[jb] == "ninja") {
							if (nb % 3 == 0) { bluew.info.sword = (int) (0.2*bluew.info.force); }
							else if (nb % 3 == 1) { bluew.info.bomb = 1; }
							else if (nb % 3 == 2) { bluew.info.arrow = 3; }
							if (bluename[jb] == "ninja") {
								bluew.info.name = "ninja";
								if ((nb + 1) % 3 == 0) { bluew.info.sword = (int)(0.2*bluew.info.force); }
								else if ((nb + 1) % 3 == 1) { bluew.info.bomb = 1; }
								else if ((nb + 1) % 3 == 2) { bluew.info.arrow = 3; }
								cout << setfill('0') << setw(3) << hour << ":00 blue ninja " << nb << " born" << endl;
							}
							else if (bluename[jb] == "iceman") {
								bluew.info.name = "iceman";
								cout << setfill('0') << setw(3) << hour << ":00 blue iceman " << nb << " born" << endl;
							}
							else if (bluename[jb] == "dragon") {
								bluew.info.name = "dragon";
								bluew.info.sq = (double)a.Mb / (double)bluew.info.life;
								cout << setfill('0') << setw(3) << hour << ":00 blue dragon " << nb << " born" << endl;
								cout << "Its morale is " << fixed<< setprecision(2)<<bluew.info.sq << endl;
							}
						}
						else if (bluename[jb] == "lion") {
							bluew.info.name = "lion"; bluew.info.loyalty = a.Mb;
							cout << setfill('0') << setw(3) << hour << ":00 blue lion " << nb << " born" << endl;
							cout << "Its loyalty is " << bluew.info.loyalty << endl;
						}
						else if (bluename[jb] == "wolf") {
							bluew.info.name = "wolf";
							cout << setfill('0') << setw(3) << hour << ":00 blue wolf " << nb << " born" << endl;
						}
						mb.insert(make_pair(bluew.n, bluew.info)); ++jb;
					}
				}
				T -= 5; if (T < 0) break; else min += 5;

				if (min == 5) { //lion ran away
					if (mr.size() != 0) { 
						i = mr.end(); --i;  //lion born with 0 loyalty would run away too
						if (i->second.name == "lion" && i->second.loyalty <= 0 && i->second.step==0){ 
							cout << setfill('0') << setw(3) << hour << ":05 red lion " << i->first << " ran away" << endl; 
							++i;
							if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
							else {
								--i;
								if (mr.size() == 1) { mr.erase(i); }
								else { --i; temp = i; ++i; mr.erase(i); i = temp; }
							}
						}
					} 
					MAP::iterator j; if (mb.size() != 0) { j = mb.begin(); }
					for (icity = acity.begin(); icity != acity.end(); ++icity) {
						if (icity->second.blue != 0 || icity->second.red != 0) {
							if (icity->second.red != 0) { // the city has red warrior
								while (i->second.step < icity->first && i!=mr.begin()) { --i; }
								if (i->second.step == icity->first && i->second.name == "lion" && i->second.loyalty <= 0 ) {
									cout << setfill('0') << setw(3) << hour << ":05 red lion " << i->first << " ran away" << endl;
									++i;
									if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
									else {
										--i;
										if (mr.size() == 1) { mr.erase(i); }
										else { --i; temp = i; ++i; mr.erase(i); i = temp; }
									}
									icity->second.red -= 1;
								}
							}
							if (icity->second.blue != 0) {
								while (N + 1 - j->second.step < icity->first && j != mb.end()) { ++j; }
								if (j == mb.end()) { --j; }
								if (N + 1 - j->second.step == icity->first && j->second.name == "lion" && j->second.loyalty <= 0) {
									cout << setfill('0') << setw(3) << hour << ":05 blue lion " << j->first << " ran away" << endl;
									++j;
									if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
									else {
										--j;
										if (mb.size() == 1) { mb.erase(j); }
										else { --j; temp = j; ++j; mb.erase(j); j = temp; }
									}
									icity->second.blue -= 1;
								}
							}
						}
					}
					if (mb.size() != 0) { //blue lion born with 0 loyalty will run away too
						j = mb.end(); --j; if (j->second.name == "lion" && j->second.loyalty <= 0 && j->second.step == 0) { //blue lion in the headquarter
							cout << setfill('0') << setw(3) << hour << ":05 blue lion " << j->first << " ran away" << endl;
							++j;
							if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
							else {
								--j;
								if (mb.size() == 1) { mb.erase(j); }
								else { --j; temp = j; ++j; mb.erase(j); j = temp; }
							}
						}
					}
				}
				T -= 5; if (T < 0) break; else min += 5;

				if (min == 10) { //everybody makes a move to the next city/headquarter
					MAP::iterator j; 
					if (mb.size() != 0) { //everybody makes a step first
						for (j = mb.begin(); j != mb.end(); ++j) { j->second.step += 1; }
					}
					if (mr.size() != 0) {
						for (i = mr.begin(); i != mr.end(); ++i) { i->second.step += 1; }
					}

					if (mb.size() != 0) { // if blue warrior marched into red head quarter
						j = mb.begin(); 
						while (j->second.step > N + 1 && j != mb.end()) { ++j; if (j == mb.end()) { --j; break; } }
						
						if (j->second.step == N + 1) {
							if (j->second.name == "iceman") { //iceman force increase/life decrease
								if (j->second.step % 2 == 0) {
									if (i->second.life <= 9) { i->second.life = 1; i->second.force += 20; }
									else { i->second.life -= 9; i->second.force += 20; }
								}
							}
							cout << setfill('0') << setw(3) << hour << ":10 blue " << j->second.name << " " << j->first << " reached red headquarter with " << j->second.life << " elements and force " << j->second.force << endl;
							a.bluetor += 1;
							if (a.bluetor == 2) {
								cout << setfill('0') << setw(3) << hour << ":10 red headquarter was taken" << endl;
							}
							icity = acity.begin(); icity->second.blue -= 1;
						}
					}

					if (mr.size() != 0) { i = mr.end(); --i; }
					if (mb.size() != 0) { j = mb.begin(); }
					for (icity = acity.begin(); icity != acity.end(); ++icity) {
						if (mr.size() != 0) {
							while (i->second.step < icity->first && i != mr.begin()) { --i; }
							if (i->second.step == icity->first && icity->first <= N) {
								if (icity->first > 1) { icity->second.red += 1; --icity; icity->second.red -= 1; ++icity; }
								else { icity->second.red += 1; }
								if (i->second.name == "iceman") { //iceman force increase/life decrease
									if (i->second.step % 2 == 0) {
										if (i->second.life <= 9) { i->second.life = 1; i->second.force += 20; }
										else { i->second.life -= 9; i->second.force += 20; }
									}
								}
								if (i->second.step <= N) {
									cout << setfill('0') << setw(3) << hour << ":10 red " << i->second.name << " " << i->first << " marched to city " << i->second.step << " with " << i->second.life << " elements and force " << i->second.force << endl;
								}
							}
						}
							
						if (mb.size() != 0) {
							if (icity != acity.end()) {
								while (N + 1 - j->second.step < icity->first ) { ++j; if (j == mb.end()) { --j; break; }}
								if (N + 1 - j->second.step == icity->first) {
									if (j->second.step > 1) { icity->second.blue += 1; ++icity; icity->second.blue -= 1; --icity; }
									else { icity->second.blue += 1; }
									if (j->second.name == "iceman") {
										if (j->second.step % 2 == 0) {
											if (j->second.life <= 9) { j->second.life = 1; j->second.force += 20; }
											else { j->second.life -= 9; j->second.force += 20; }
										}
									}
									cout << setfill('0') << setw(3) << hour << ":10 blue " << j->second.name << " " << j->first << " marched to city " << N + 1 - j->second.step << " with " << j->second.life << " elements and force " << j->second.force << endl;
								}
							}
						}
					}

					if (mr.size() != 0) { //red warrior entering the headquarter
						i = mr.begin();
						while (i->second.step > N + 1 && i!=mr.end()) { ++i; }
						if (i == mr.end()) { --i; }
						if (i->second.step == N + 1) {
							icity = acity.end(); --icity; icity->second.red -= 1; 
							if (i->second.name == "iceman") { //iceman force increase/life decrease
								if (i->second.step % 2 == 0) {
									if (i->second.life <= 9) { i->second.life = 1; i->second.force += 20; }
									else { i->second.life -= 9; i->second.force += 20; }
								}
							}
							cout << setfill('0') << setw(3) << hour << ":10 red " << i->second.name << " " << i->first << " reached blue headquarter with " << i->second.life << " elements and force " << i->second.force << endl;
							a.redtob += 1;
							if (a.redtob == 2) { //two warriors in the headquarter
								cout << setfill('0') << setw(3) << hour << ":10 blue headquarter was taken" << endl; break;
							}
						}
					}

					if (a.bluetor == 2 || a.redtob == 2) { break; }
				}
				T -= 10; if (T < 0) break; else min += 10;

				if (min == 20) { //city life add 10
					for (icity = acity.begin(); icity != acity.end(); ++icity) { icity->second.life += 10; }
				}
				T -= 10; if (T < 0) break; else min += 10;

				if (min == 30) { //if only one warrior in the city, he will have the city life
					for (icity = acity.begin(); icity != acity.end(); ++icity) {
						if (icity->second.blue == 1 && icity->second.red == 0 ) { 
							a.Mb += icity->second.life;  
							for (i = mb.begin(); i != mb.end(); ++i) {
								if (i->second.step == N + 1 - icity->first) {
									cout << setfill('0') << setw(3) << hour << ":30 blue " << i->second.name << " " << i->first << " earned "<<icity->second.life<<" elements for his headquarter" << endl; 
									icity->second.life = 0; break;
								}
							}
						}
						else if (icity->second.red == 1 && icity->second.blue == 0 ) { 
							a.Mr += icity->second.life; 
							i = mr.end(); --i;
							for (; i != mr.begin(); --i) {
								if (i->second.step == icity->first) {
									cout << setfill('0') << setw(3) << hour << ":30 red " << i->second.name << " " << i->first << " earned " << icity->second.life << " elements for his headquarter" << endl; 
									icity->second.life = 0; break;
								}
							}
							if (i == mr.begin() && i->second.step == icity->first) {
								cout << setfill('0') << setw(3) << hour << ":30 red " << i->second.name << " " << i->first << " earned " << icity->second.life << " elements for his headquarter" << endl;
								icity->second.life = 0; 
							}
						}
					}
				}
				T -= 5; if (T < 0) break; else min += 5;

				if (min == 35) { //arrow attack
					if (mr.size() != 0 && mb.size() != 0) {
						MAP::iterator j; i = mr.end(); --i; icity = acity.begin();

						if (acity.size() > 1) {
							i = mr.end(); --i; icity = acity.begin(); ++icity;
							if (i->second.step == 1 && i->second.arrow > 0 && icity->second.blue > 0) { //red shot in city 1
								j = mb.begin();
								while (N + 1 - j->second.step < 2 && j != mb.end()) { ++j; }
								if (j->second.step == N - 1) {
									cout << setfill('0') << setw(3) << hour << ":35 red " << i->second.name << " " << i->first << " shot";
									j->second.life -= R; i->second.arrow -= 1;
									if (j->second.life <= 0) { cout << " and killed blue " << j->second.name << " " << j->first; }
									cout << endl;
								}
							}
						}

						icity = acity.begin(); ++icity; j = mb.begin();
						for (; icity != acity.end(); ++icity) {
							while (i->second.step < icity->first && i != mr.begin()) { --i; }
							if (i->second.step == icity->first && i->second.arrow > 0 && i->second.step != N) {
								++icity;
								if (icity->second.blue > 0) {
									while (N + 1 - j->second.step < icity->first && j != mb.end()) { ++j; }
									if (j == mb.end()) { --j; }
									if (N + 1 - j->second.step == icity->first) {
										cout << setfill('0') << setw(3) << hour << ":35 red " << i->second.name << " " << i->first << " shot";
										j->second.life -= R; i->second.arrow -= 1;
										if (j->second.life <= 0) { 
											cout << " and killed blue " << j->second.name << " " << j->first; 
										}
										cout << endl;
									}
									--icity;
								}
								else --icity;
							}

							j = mb.begin();
							while (N + 1 - j->second.step < icity->first && j != mb.end()) { ++j; if (j == mb.end()) { --j; break; }}
							if (N + 1 - j->second.step == icity->first && j->second.arrow > 0){
								--icity;
								if (icity->second.red > 0) {
									temp = mr.end(); --temp;
									while (temp->second.step < icity->first && temp != mr.begin()) { --temp; }
									if (temp->second.step == icity->first) {
										cout << setfill('0') << setw(3) << hour << ":35 blue " << j->second.name << " " << j->first << " shot";
										temp->second.life -= R; j->second.arrow -= 1;
										if (temp->second.life <= 0) {
											cout << " and killed red " << temp->second.name << " " << temp->first;
										}
										cout << endl;
									}
									++icity;
								}
								else ++icity;
							}
						}
					}
				}
				T -= 3; if (T < 0) break; else min += 3;

				if (min == 38) { //bomb attack
					if (mr.size() != 0 && mb.size() != 0) {
						MAP::iterator j=mb.begin(); i = mr.end(); --i;
						for (icity = acity.begin(); icity != acity.end(); ++icity) {
							if (icity->second.blue > 0 && icity->second.red > 0) {
								while (i->second.step < icity->first && i != mr.begin()) { --i; }
								while (N + 1 - j->second.step < icity->first && j != mb.end()) { ++j; }
								if (j == mb.end()) { --j; }
								if (i->second.step == N + 1 - j->second.step){ 
									if (i->second.bomb > 0) {
										if (((icity->second.flag == 'r' || (icity->first % 2 == 1 && icity->second.flag != 'b')) && i->second.life > 0 && j->second.life > 0 && j->second.life > i->second.force + i->second.sword &&
											i->second.life <= j->second.force / 2 + j->second.sword && j->second.name!="ninja" ) ||
											((icity->second.flag == 'b' || (icity->first % 2 == 0 && icity->second.flag != 'r')) && i->second.life <= j->second.force + j->second.sword && i->second.life > 0 && j->second.life > 0)) {
											cout << setfill('0') << setw(3) << hour << ":38 red " << i->second.name << " " << i->first << " used a bomb and killed blue " << j->second.name << " " << j->first << endl;
											++i;
											if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
											else {
												--i;
												if (mr.size() == 1) { mr.erase(i); }
												else { --i; temp = i; ++i; mr.erase(i); i = temp; }
											}
											icity->second.red -= 1;
											++j;
											if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
											else {
												--j;
												if (mb.size() == 1) { mb.erase(j); }
												else { --j; temp = j; ++j; mb.erase(j); j = temp; }
											}
											icity->second.blue -= 1;
										}
									}
									if (j->second.bomb > 0) {
										if (((icity->second.flag == 'r' || (icity->first % 2 == 1 && icity->second.flag != 'b')) && j->second.life <= i->second.force + i->second.sword && j->second.life > 0 && i->second.life > 0 && icity->second.blue > 0) ||
											((icity->second.flag == 'b' || (icity->first % 2 == 0 && icity->second.flag != 'r')) && j->second.life > 0 && i->second.life > 0 && i->second.life > j->second.force + j->second.sword &&
												j->second.life <= i->second.force / 2 + i->second.sword && i->second.name!="ninja" ) && icity->second.blue>0) {
											cout << setfill('0') << setw(3) << hour << ":38 blue " << j->second.name << " " << j->first << " used a bomb and killed red " << i->second.name << " " << i->first << endl;
											++i;
											if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
											else {
												--i;
												if (mr.size() == 1) { mr.erase(i); }
												else { --i; temp = i; ++i; mr.erase(i); i = temp; }
											}
											icity->second.red -= 1;
											++j;
											if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
											else {
												--j;
												if (mb.size() == 1) { mb.erase(j); }
												else { --j; temp = j; ++j; mb.erase(j); j = temp; }
											}
											icity->second.blue -= 1;
										}
									}
								}
							}
						}
					}
				}
				T -= 2; if (T < 0) break; else min += 2;
				
				if (min == 40) {
					if (mr.size() != 0 && mb.size() != 0) {
						set<int> v;
						for (icity = acity.begin(); icity != acity.end(); ++icity) {
							if (icity->second.blue == 0 || icity->second.red == 0) { //shot by enemy but his the only one in the city
								if (icity->second.blue == 0 && icity->second.red > 0){
									i = mr.end(); --i; 
									for (; i != mr.begin(); --i) { if (i->second.step == icity->first) { break; } }
									if (i->second.step == icity->first && i->second.life <= 0) {
										++i;
										if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
										else {
											--i;
											if (mr.size() == 1) { mr.erase(i); }
											else { --i; temp = i; ++i; mr.erase(i); i = temp; }
										}
										icity->second.red -= 1;
									}
								}
								else if (icity->second.red == 0 && icity->second.blue > 0) {
									MAP::iterator j = mb.begin(); //find the blue warrior
									for (; j != mb.end(); ++j) { if (j->second.step == N + 1 - icity->first) { break; } }
									if (j->second.step == N + 1 - icity->first && j->second.life <= 0) {
										++j;
										if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
										else {
											--j;
											if (mb.size() == 1) { mb.erase(j); }
											else { --j; temp = j; ++j; mb.erase(j); j = temp; }
										}
										icity->second.blue -= 1;
									}
								}
							}

							else if (icity->second.blue > 0 && icity->second.red > 0) { //enemies meet
								i = mr.end(); --i; //find the red warrior
								for (; i != mr.begin(); --i) { if (i->second.step == icity->first) { break; } } //suppose we could find it no matter what

								MAP::iterator j = mb.begin(); //find the blue warrior
								for (; j != mb.end(); ++j) { if (j->second.step == N + 1 - icity->first) { break; } } //found both if them, the war shall start

								if (i != mr.end() && j != mb.end()) {
									if (i->second.life <= 0 || j->second.life <= 0) { //any of them was killed by arrow
										if (i->second.life > 0) {
											v.insert(i->first);
											if (i->second.name == "dragon") {
												i->second.sq += 0.2;
												if ((icity->second.flag == 'r' || (icity->first % 2 == 1 && icity->second.flag != 'b')) && i->second.sq > 0.8) {
													cout << setfill('0') << setw(3) << hour << ":40 red dragon " << i->first << " yelled in city " << icity->first << endl;
												}
											}
											else if (i->second.name == "wolf") {
												if (i->second.sword <= 0) { i->second.sword = j->second.sword; }
												if (i->second.arrow <= 0) { i->second.arrow = j->second.arrow; }
												if (i->second.bomb <= 0) { i->second.bomb = j->second.bomb; }
											}
											++j;
											if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
											else {
												--j;
												if (mb.size() == 1) { mb.erase(j); }
												else { --j; temp = j; ++j; mb.erase(j); j = temp; }
											}
											icity->second.blue -= 1;
											cout << setfill('0') << setw(3) << hour << ":40 red " << i->second.name << " " << i->first << " earned " << icity->second.life << " elements for his headquarter" << endl;
											a.cityawardr += icity->second.life; icity->second.life = 0; //citylife give to headquarter
											icity->second.flagr += 1; icity->second.flagb = 0;
											if (icity->second.flagr == 2 && icity->second.flag!='r') { // raise the flag
												cout << setfill('0') << setw(3) << hour << ":40 red flag raised in city " << icity->first << endl;
												icity->second.flag = 'r'; icity->second.flagr = 0;
											}
											
										}
										else if (j->second.life > 0) {
											if (j->second.name == "dragon") {
												j->second.sq += 0.2;
												if ((icity->second.flag == 'b' || (icity->first % 2 == 0 && icity->second.flag != 'r')) && j->second.sq > 0.8) {
													cout << setfill('0') << setw(3) << hour << ":40 blue dragon " << j->first << " yelled in city " << icity->first << endl;
												}
											}
											else if (j->second.name == "wolf") {
												if (j->second.sword <= 0) { j->second.sword = i->second.sword; }
												if (j->second.arrow <= 0) { j->second.arrow = i->second.arrow; }
												if (j->second.bomb <= 0) { j->second.bomb = i->second.bomb; }
											}
											++i;
											if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
											else {
												--i;
												if (mr.size() == 1) { mr.erase(i); }
												else { --i; temp = i; ++i; mr.erase(i); i = temp; }
											}
											icity->second.red -= 1;
											if (a.Mb >= 8) { a.Mb -= 8; j->second.life += 8; }
											cout << setfill('0') << setw(3) << hour << ":40 blue " << j->second.name << " " << j->first << " earned " << icity->second.life << " elements for his headquarter" << endl;
											a.cityawardb += icity->second.life; icity->second.life = 0;
											icity->second.flagb += 1; icity->second.flagr = 0;
											if (icity->second.flagb == 2 && icity->second.flag != 'b') {
												cout << setfill('0') << setw(3) << hour << ":40 blue flag raised in city " << icity->first << endl;
												icity->second.flag = 'b'; icity->second.flagb = 0;
											}
										}
										else {
											++i;
											if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
											else { 
												--i; 
												if (mr.size() == 1) { mr.erase(i); }
												else { --i; temp = i; ++i; mr.erase(i); i = temp; }
											}
											icity->second.red -= 1;
											++j;
											if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
											else {
												--j;
												if (mb.size() == 1) { mb.erase(j); }
												else { --j; temp = j; ++j; mb.erase(j); j = temp; }
											}
											icity->second.blue -= 1;
										}
									}

									else { //both alive,then fight
										int templifer = i->second.life; int templifeb = j->second.life;
										if (icity->second.flag == 'r' || (icity->first % 2 == 1 && icity->second.flag != 'b')) { //attack first by red
											cout << setfill('0') << setw(3) << hour << ":40 red " << i->second.name << " " << i->first << " attacked blue " << j->second.name << " " << j->first << " in city " << icity->first << " with " << i->second.life << " elements and force " << i->second.force << endl;
											j->second.life -= (i->second.force + i->second.sword); i->second.sword = (int)(0.8 * i->second.sword);
											if (j->second.life <= 0) { //dead
												cout << setfill('0') << setw(3) << hour << ":40 blue " << j->second.name << " " << j->first << " was killed in city " << icity->first << endl;
												v.insert(i->first);
												if (j->second.name == "lion") { i->second.life += templifeb; }
												if (i->second.name == "dragon") {
													i->second.sq += 0.2;
													if (i->second.sq > 0.8) {
														cout << setfill('0') << setw(3) << hour << ":40 red dragon " << i->first << " yelled in city " << icity->first << endl;
													}
												}
												else if (i->second.name == "wolf") {
													if (i->second.sword <= 0) { i->second.sword = j->second.sword; }
													if (i->second.arrow <= 0) { i->second.arrow = j->second.arrow; }
													if (j->second.bomb <= 0) { i->second.bomb = j->second.bomb; }
												}
												++j;
												if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
												else { 
													--j; 
													if (mb.size()==1){ mb.erase(j); }
													else { --j; temp = j; ++j; mb.erase(j); j = temp; }
												}
												icity->second.blue -= 1;
												cout << setfill('0') << setw(3) << hour << ":40 red " << i->second.name << " " << i->first << " earned " << icity->second.life << " elements for his headquarter" << endl;
												a.cityawardr += icity->second.life; icity->second.life = 0;
												icity->second.flagr += 1; icity->second.flagb = 0;
												if (icity->second.flagr == 2 && icity->second.flag!='r') {
													cout << setfill('0') << setw(3) << hour << ":40 red flag raised in city " << icity->first << endl;
													icity->second.flag = 'r'; icity->second.flagr = 0;
												}
											}
											else {
												icity->second.flagr = 0;
												if (i->second.name == "dragon") { i->second.sq -= 0.2; }
												else if (i->second.name == "lion") { i->second.loyalty -= K; }
												if (j->second.name != "ninja") {
													cout << setfill('0') << setw(3) << hour << ":40 blue " << j->second.name << " " << j->first << " fought back against red " << i->second.name << " " << i->first << " in city " << icity->first << endl;
													i->second.life -= (j->second.force / 2 + j->second.sword); j->second.sword = (int)(0.8 * j->second.sword);
													if (i->second.life <= 0) {
														cout << setfill('0') << setw(3) << hour << ":40 red " << i->second.name << " " << i->first << " was killed in city " << icity->first << endl;
														if (i->second.name == "lion") { j->second.life += templifer; }
														if (j->second.name == "dragon") { j->second.sq += 0.2; }
														else if (j->second.name == "wolf") {
															if (j->second.sword <= 0) { j->second.sword = i->second.sword; }
															if (j->second.arrow <= 0) { j->second.arrow = i->second.arrow; }
															if (j->second.bomb <= 0) { j->second.bomb = i->second.bomb; }
														}
														++i;
														if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
														else {
															--i;
															if (mr.size() == 1) { mr.erase(i); }
															else { --i; temp = i; ++i; mr.erase(i); i = temp; }
														}
														icity->second.red -= 1;
														cout << setfill('0') << setw(3) << hour << ":40 blue " << j->second.name << " " << j->first << " earned " << icity->second.life << " elements for his headquarter" << endl;
														a.cityawardb += icity->second.life; icity->second.life = 0;
														if (a.Mb >= 8) { a.Mb -= 8; j->second.life += 8; }
														icity->second.flagb += 1; icity->second.flagr = 0;
														if (icity->second.flagb == 2 && icity->second.flag!='b') {
															cout << setfill('0') << setw(3) << hour << ":40 blue flag raised in city " << icity->first << endl;
															icity->second.flag = 'b'; icity->second.flagb = 0;
														}
													}
													else {
														if (j->second.name == "lion") { j->second.loyalty -= K; }
														if (i->second.name == "dragon") {
															i->second.sq -= 0.2;
															if (i->second.sq > 0.8) {
																cout << setfill('0') << setw(3) << hour << ":40 red dragon " << i->first << " yelled in city " << icity->first << endl;
															}
														}
														icity->second.flagb = 0; icity->second.flagr = 0;
													}
												}
												else { 
													if (i->second.name == "dragon") {
														i->second.sq -= 0.2;
														if (i->second.sq > 0.8) {
															cout << setfill('0') << setw(3) << hour << ":40 red dragon " << i->first << " yelled in city " << icity->first << endl;
														}
													}
													if (j->second.name == "lion") { j->second.loyalty -= K; }
													icity->second.flagr = 0; icity->second.flagb = 0; 
												}
											}
										}

										else if (icity->second.flag == 'b' || (icity->first % 2 == 0 && icity->second.flag != 'r')) { //attack first by blue
											cout << setfill('0') << setw(3) << hour << ":40 blue " << j->second.name << " " << j->first << " attacked red " << i->second.name << " " << i->first << " in city " << icity->first << " with " << j->second.life << " elements and force " << j->second.force << endl;
											i->second.life -= (j->second.force + j->second.sword); j->second.sword = (int)(0.8 * j->second.sword);
											if (i->second.life <= 0) { //dead
												cout << setfill('0') << setw(3) << hour << ":40 red " << i->second.name << " " << i->first << " was killed in city " << icity->first << endl;
												if (i->second.name == "lion") { j->second.life += templifer; }
												if (j->second.name == "dragon") {
													j->second.sq += 0.2;
													if (j->second.sq > 0.8) { cout << setfill('0') << setw(3) << hour << ":40 blue dragon " << j->first << " yelled in city " << icity->first << endl; }
												}
												else if (j->second.name == "wolf") {
													if (j->second.sword <= 0) { j->second.sword = i->second.sword; }
													if (j->second.sword <= 0) { j->second.arrow = i->second.arrow; }
													if (j->second.sword <= 0) { j->second.bomb = i->second.bomb; }
												}
												++i;
												if (i != mr.end()) { temp = i; --i; mr.erase(i); i = temp; }
												else {
													--i;
													if (mr.size() == 1) { mr.erase(i); }
													else { --i; temp = i; ++i; mr.erase(i); i = temp; }
												}
												icity->second.red -= 1;
												cout << setfill('0') << setw(3) << hour << ":40 blue " << j->second.name << " " << j->first << " earned " << icity->second.life << " elements for his headquarter" << endl;
												a.cityawardb += icity->second.life; icity->second.life = 0;
												if (a.Mb >= 8) { a.Mb -= 8; j->second.life += 8; }
												icity->second.flagb += 1; icity->second.flagr = 0;
												if (icity->second.flagb == 2 && icity->second.flag!='b') {
													cout << setfill('0') << setw(3) << hour << ":40 blue flag raised in city " << icity->first << endl;
													icity->second.flag = 'b'; icity->second.flagb = 0;
												}
												
											}
											else {
												if (j->second.name == "lion") { j->second.loyalty -= K; }
												else if (j->second.name == "dragon") { j->second.sq -= 0.2; }
												if (i->second.name != "ninja") {
													cout << setfill('0') << setw(3) << hour << ":40 red " << i->second.name << " " << i->first << " fought back against blue " << j->second.name << " " << j->first << " in city " << icity->first << endl;
													j->second.life -= (i->second.force / 2 + i->second.sword); i->second.sword = (int)(0.8 * i->second.sword);
													if (j->second.life <= 0) {
														v.insert(i->first); 
														cout << setfill('0') << setw(3) << hour << ":40 blue " << j->second.name << " " << j->first << " was killed in city " << icity->first << endl;
														if (j->second.name == "lion") { i->second.life += templifeb; }
														if (i->second.name == "dragon") { i->second.sq += 0.2; }
														else if (i->second.name == "wolf") {
															if (i->second.sword <= 0) { i->second.sword = j->second.sword; }
															if (i->second.arrow <= 0) { i->second.arrow = j->second.arrow; }
															if (i->second.bomb <= 0) { i->second.bomb = j->second.bomb; }
														}
														++j;
														if (j != mb.end()) { temp = j; --j; mb.erase(j); j = temp; }
														else {
															--j;
															if (mb.size() == 1) { mb.erase(j); }
															else { --j; temp = j; ++j; mb.erase(j); j = temp; }
														}
														icity->second.blue -= 1;
														cout << setfill('0') << setw(3) << hour << ":40 red " << i->second.name << " " << i->first << " earned " << icity->second.life << " elements for his headquarter" << endl;
														a.cityawardr += icity->second.life; icity->second.life = 0;
														icity->second.flagr += 1; icity->second.flagb = 0;
														if (icity->second.flagr == 2 && icity->second.flag!='r') {
															cout << setfill('0') << setw(3) << hour << ":40 red flag raised in city " << icity->first << endl;
															icity->second.flag = 'r'; icity->second.flagr = 0;
														}
													}
													else {
														if (i->second.name == "lion") { i->second.loyalty -= K; }
														if (j->second.name == "dragon") {
															j->second.sq -= 0.2;
															if (j->second.sq > 0.8) {
																cout << setfill('0') << setw(3) << hour << ":40 blue dragon " << j->first << " yelled in city " << icity->first << endl;
															}
														}
														icity->second.flagr = 0; icity->second.flagb = 0;
													}
												}
												else { 
													if (i->second.name == "lion") { i->second.loyalty -= K; }
													if (j->second.name == "dragon") {
														j->second.sq -= 0.2;
														if (j->second.sq > 0.8) {
															cout << setfill('0') << setw(3) << hour << ":40 blue dragon " << j->first << " yelled in city " << icity->first << endl;
														}
													}
													icity->second.flagb = 0; icity->second.flagr = 0;
												}
											}
										}
									}
								}
							}
						}
						if (v.size() != 0) {
							i = mr.end(); --i;
							for (; i != mr.begin(); --i) {
								if (a.Mr < 8) { break; }
								if (v.find(i->first) != v.end()) { i->second.life += 8; a.Mr -= 8; }
							}
							if (v.find(i->first) != v.end() && a.Mr >= 8) { i->second.life += 8; a.Mr -= 8; }
						}
						a.Mr += a.cityawardr; a.cityawardr = 0; a.Mb += a.cityawardb; a.cityawardb = 0;
					}
				}
				T -= 10; if (T < 0) break; else min += 10;

				if (min == 50) { //headquarter report life
					cout << setfill('0') << setw(3) << hour << ":50 " << a.Mr << " elements in red headquarter" << endl;
					cout << setfill('0') << setw(3) << hour << ":50 " << a.Mb << " elements in blue headquarter" << endl;
				}
				T -= 5; if (T < 0) break; else min += 5;

				if (min == 55) { //cout the weapon situation
					if (mr.size() != 0) {
						i = mr.end(); --i;
						for (; i != mr.begin(); --i) {
							cout << setfill('0') << setw(3) << hour << ":55 red " << i->second.name << " " << i->first << " has ";
							if (i->second.sword == 0 && i->second.bomb == 0 && i->second.arrow == 0) {
								cout << "no weapon";
							}
							else if (i->second.arrow != 0) {
								cout << "arrow(" << i->second.arrow << ")";
								if (i->second.bomb != 0) { cout << ",bomb"; }
								if (i->second.sword != 0) { cout << ",sword(" << i->second.sword << ")"; }
							}
							else if (i->second.bomb != 0) {
								cout << "bomb";
								if (i->second.sword != 0) { cout << ",sword(" << i->second.sword << ")"; }
							}
							else if (i->second.sword != 0) { cout << "sword(" << i->second.sword << ")"; }
							cout << endl;
						}
						if (i == mr.begin()) {
							cout << setfill('0') << setw(3) << hour << ":55 red " << i->second.name << " " << i->first << " has ";
							if (i->second.sword == 0 && i->second.bomb == 0 && i->second.arrow == 0) {
								cout << "no weapon";
							}
							else if (i->second.arrow != 0) {
								cout << "arrow(" << i->second.arrow << ")";
								if (i->second.bomb != 0) { cout << ",bomb"; }
								if (i->second.sword != 0) { cout << ",sword(" << i->second.sword << ")"; }
							}
							else if (i->second.bomb != 0) {
								cout << "bomb";
								if (i->second.sword != 0) { cout << ",sword(" << i->second.sword << ")"; }
							}
							else if (i->second.sword != 0) { cout << "sword(" << i->second.sword << ")"; }
							cout << endl;

						}
					}

					if (mb.size() != 0) {
						for (i = mb.begin(); i != mb.end(); ++i) {
							cout << setfill('0') << setw(3) << hour << ":55 blue " << i->second.name << " " << i->first << " has ";
							if (i->second.sword == 0 && i->second.bomb == 0 && i->second.arrow == 0) { cout << "no weapon"; }
							else if (i->second.arrow != 0) {
								cout << "arrow(" << i->second.arrow << ")";
								if (i->second.bomb != 0) { 
									cout << ",bomb"; }
								if (i->second.sword != 0) { 
									cout << ",sword(" << i->second.sword << ")"; }
							}
							else if (i->second.bomb != 0) {
								cout << "bomb";
								if (i->second.sword != 0) { cout << ",sword(" << i->second.sword << ")"; }
							}
							else if (i->second.sword != 0) { cout << "sword(" << i->second.sword << ")"; }
							cout << endl;
						}
					}
				}
				T -= 5; if (T < 0) break; else hour += 1; min = 0;
			}
		}
	}
	return 0;
}

Github: Westwood2723
Weibo: Cecilia_西木

你可能感兴趣的:(C++程序设计-魔兽终极版)