18.04.06 魔獸世界三(開戰)


描述

魔獸世界的西面是紅魔軍的司令部,東面是藍魔軍的司令部。兩個司令部之間是依次排列的若干城市,城市從西向東依次編號為1,2,3 .... N ( N <= 20)。紅魔軍的司令部算作編號為0的城市,藍魔軍的司令部算作編號為N+1的城市。司令部有生命元,用於制造武士。

 

兩軍的司令部都會制造武士。武士一共有dragon 、ninja、iceman、lion、wolf 五種。每種武士都有編號、生命值、攻擊力這三種屬性。

 

雙方的武士編號都是從1開始計算。紅方制造出來的第n 個武士,編號就是n。同樣,藍方制造出來的第n 個武士,編號也是n。

 

武士在剛降生的時候有一個初始的生命值,生命值在戰斗中會發生變化,如果生命值減少到0(生命值變為負數時應當做變為0處理),則武士死亡(消失)。

武士可以擁有武器。武器有三種,sword, bomb,和arrow,編號分別為0,1,2。

sword的攻擊力是使用者當前攻擊力的20%(去尾取整)。

bomb的攻擊力是使用者當前攻擊力的40%(去尾取整),但是也會導致使用者受到攻擊,對使用者的攻擊力是對敵人取整后的攻擊力的1/2(去尾取整)。Bomb一旦使用就沒了。

arrow的攻擊力是使用者當前攻擊力的30%(去尾取整)。一個arrow用兩次就沒了。

 

 

武士降生后就朝對方司令部走,在經過的城市如果遇到敵人(同一時刻每個城市最多只可能有1個藍武士和一個紅武士),就會發生戰斗。戰斗的規則是:

  1. 在奇數編號城市,紅武士先發起攻擊

  2. 在偶數編號城市,藍武士先發起攻擊

  3. 戰斗開始前,雙方先對自己的武器排好使用順序,然后再一件一件地按順序使用。編號小的武器,排在前面。若有多支arrow,用過的排在前面。排好序后,攻擊者按此排序依次對敵人一件一件地使用武器。如果一種武器有多件,那就都要用上。每使用一件武器,被攻擊者生命值要減去武器攻擊力。如果任何一方生命值減為0或小於0即為死去。有一方死去,則戰斗結束。

  4. 雙方輪流使用武器,甲用過一件,就輪到乙用。某一方把自己所有的武器都用過一輪后,就從頭開始再用一輪。如果某一方沒有武器了,那就挨打直到死去或敵人武器用完。武器排序只在戰斗前進行,戰斗中不會重新排序。

  5. 如果雙方武器都用完且都還活着,則戰斗以平局結束。如果雙方都死了,也算平局。

  6. 有可能由於武士自身攻擊力太低,而導致武器攻擊力為0。攻擊力為0的武器也要使用。如果戰斗中雙方的生命值和武器的狀態都不再發生變化,則戰斗結束,算平局。

  7. 戰斗的勝方獲得對方手里的武器。武士手里武器總數不超過10件。繳獲武器時,按照武器種類編號從小到大繳獲。如果有多件arrow,優先繳獲沒用過的。

  8. 如果戰斗開始前雙方都沒有武器,則戰斗視為平局。如果先攻擊方沒有武器,則由后攻擊方攻擊。

不同的武士有不同的特點。

編號為n的dragon降生時即獲得編號為n%3 的武器。dragon在戰斗結束后,如果還沒有戰死,就會歡呼。

 

編號為n的ninjia降生時即獲得編號為n%3 和(n+1)%3的武器。ninja 使用bomb不會讓自己受傷。

 

編號為n的iceman降生時即獲得編號為n%3 的武器。iceman每前進一步,生命值減少10%(減少的量要去尾取整)。

 

編號為n的lion降生時即獲得編號為n%3 的武器。lion 有“忠誠度”這個屬性,其初始值等於它降生之后其司令部剩余生命元的數目。每前進一步忠誠度就降低K。忠誠度降至0或0以下,則該lion逃離戰場,永遠消失。但是已經到達敵人司令部的lion不會逃跑。lion在己方司令部可能逃跑。

 

wolf降生時沒有武器,但是在戰斗開始前會搶到敵人編號最小的那種武器。如果敵人有多件這樣的武器,則全部搶來。Wolf手里武器也不能超過10件。如果敵人arrow太多沒法都搶來,那就先搶沒用過的。如果敵人也是wolf,則不搶武器。

 

以下是不同時間會發生的不同事件:

 

在每個整點,即每個小時的第0分, 雙方的司令部中各有一個武士降生。

 

紅方司令部按照iceman、lion、wolf、ninja、dragon 的順序制造武士。

 

藍方司令部按照lion、dragon、ninja、iceman、wolf 的順序制造武士。

 

制造武士需要生命元。

 

制造一個初始生命值為m 的武士,司令部中的生命元就要減少m 個。

 

如果司令部中的生命元不足以制造某本該造的武士,那就從此停止制造武士。

 

在每個小時的第5分,該逃跑的lion就在這一時刻逃跑了。

 

在每個小時的第10分:所有的武士朝敵人司令部方向前進一步。即從己方司令部走到相鄰城市,或從一個城市走到下一個城市。或從和敵軍司令部相鄰的城市到達敵軍司令部。

 

在每個小時的第35分:在有wolf及其敵人的城市,wolf要搶奪對方的武器。

 

在每個小時的第40分:在有兩個武士的城市,會發生戰斗。

 

在每個小時的第50分,司令部報告它擁有的生命元數量。

 

在每個小時的第55分,每個武士報告其擁有的武器情況。

 

武士到達對方司令部后就算完成任務了,從此就呆在那里無所事事。

 

任何一方的司令部里若是出現了敵人,則認為該司令部已被敵人占領。

任何一方的司令部被敵人占領,則戰爭結束。戰爭結束之后就不會發生任何事情了。

 

給定一個時間,要求你將從0點0分開始到此時間為止的所有事件按順序輸出。事件及其對應的輸出樣例如下:

 

1) 武士降生

輸出樣例:000:00 blue dragon 1 born

表示在0點0分,編號為1的藍魔dragon武士降生

 

如果造出的是lion,那么還要多輸出一行,例:

000:00 blue lion 1 born

Its loyalty is 24

表示該lion降生時的忠誠度是24

 

2) lion逃跑

輸出樣例:000:05 blue lion 1 ran away

表示在0點5分,編號為1的藍魔lion武士逃走

 

3) 武士前進到某一城市

 

輸出樣例:

 

000:10 red iceman 1 marched to city 1 with 20 elements and force 30

表示在0點10分,紅魔1號武士iceman前進到1號城市,此時他生命值為20,攻擊力為30

對於iceman,輸出的生命值應該是變化后的數值

 

4) wolf搶敵人的武器

000:35 blue wolf 2 took 3 bomb from red dragon 2 in city 4

表示在0點35分,4號城市中,紅魔1號武士wolf 搶走藍魔2號武士dragon 3個bomb。為簡單起見,武器不寫復數形式

 

5) 報告戰斗情況

戰斗只有3種可能的輸出結果:

 

000:40 red iceman 1 killed blue lion 12 in city 2 remaining 20 elements

表示在0點40分,1號城市中,紅魔1號武士iceman 殺死藍魔12號武士lion后,剩下生命值20

 

000:40 both red iceman 1 and blue lion 12 died in city 2

注意,把紅武士寫前面

000:40 both red iceman 1 and blue lion 12 were alive in city 2

注意,把紅武士寫前面

 

6) 武士歡呼

輸出樣例:003:40 blue dragon 2 yelled in city 4

 

7) 武士抵達敵軍司令部

輸出樣例:001:10 red iceman 1 reached blue headquarter with 20 elements and force 30

(此時他生命值為20,攻擊力為30)對於iceman,輸出的生命值和攻擊力應該是變化后的數值

 

8) 司令部被占領

輸出樣例:003:10 blue headquarter was taken

 

9)司令部報告生命元數量

000:50 100 elements in red headquarter

000:50 120 elements in blue headquarter

表示在0點50分,紅方司令部有100個生命元,藍方有120個

 

10)武士報告情況

000:55 blue wolf 2 has 2 sword 3 bomb 0 arrow and 7 elements

為簡單起見,武器都不寫復數形式。elements一律寫復數,哪怕只有1個

 

交代武器情況時,次序依次是:sword,bomb, arrow。

 

輸出事件時:

 

首先按時間順序輸出;

同一時間發生的事件,按發生地點從西向東依次輸出. 武士前進的事件, 算是發生在目的地。

在一次戰斗中有可能發生上面的 5 至 6 號事件。這些事件都算同時發生,其時間就是戰斗開始時間。一次戰斗中的這些事件,序號小的應該先輸出。

兩個武士同時抵達同一城市,則先輸出紅武士的前進事件,后輸出藍武士的。

對於同一城市,同一時間發生的事情,先輸出紅方的,后輸出藍方的。

顯然,8號事件發生之前的一瞬間一定發生了7號事件。輸出時,這兩件事算同一時間發生,但是應先輸出7號事件

雖然任何一方的司令部被占領之后,就不會有任何事情發生了。但和司令部被占領同時發生的事件,全都要輸出。

 

輸入第一行是t,代表測試數據組數

每組樣例共三行。

第一行,4個整數 M,N,K, T。其含義為:
每個司令部一開始都有M個生命元( 1 <= M <= 100000)
兩個司令部之間一共有N個城市( 1 <= N <= 20 )
lion每前進一步,忠誠度就降低K。(0<=K<=100)
要求輸出從0時0分開始,到時間T為止(包括T) 的所有事件。T以分鍾為單位,0 <= T <= 6000

第二行:五個整數,依次是 dragon 、ninja、iceman、lion、wolf 的初始生命值。它們都大於0小於等於200

第三行:五個整數,依次是 dragon 、ninja、iceman、lion、wolf 的攻擊力。它們都大於0小於等於200輸出對每組數據,先輸出一行:

Case n:

如對第一組數據就輸出 Case 1:

然后按恰當的順序和格式輸出到時間T為止發生的所有事件。每個事件都以事件發生的時間開頭,時間格式是“時: 分”,“時”有三位,“分”有兩位。樣例輸入

1
20 1 10 400
20 20 30 10 20
5 5 5 5 5

樣例輸出

Case 1:
000:00 blue lion 1 born
Its loyalty is 10
000:10 blue lion 1 marched to city 1 with 10 elements and force 5
000:50 20 elements in red headquarter
000:50 10 elements in blue headquarter
000:55 blue lion 1 has 0 sword 1 bomb 0 arrow and 10 elements
001:05 blue lion 1 ran away
001:50 20 elements in red headquarter
001:50 10 elements in blue headquarter
002:50 20 elements in red headquarter
002:50 10 elements in blue headquarter
003:50 20 elements in red headquarter
003:50 10 elements in blue headquarter
004:50 20 elements in red headquarter
004:50 10 elements in blue headquarter
005:50 20 elements in red headquarter
005:50 10 elements in blue headquarter

提示

請注意浮點數精度誤差問題。OJ上的編譯器編譯出來的可執行程序,在這方面和你電腦上執行的程序很可能會不一致。5 * 0.3 的結果,有的機器上可能是 15.00000001,去尾取整得到15,有的機器上可能是14.9999999,去尾取整后就變成14。因此,本題不要寫 5 * 0.3,要寫 5 * 3 / 10。

來源

Guo Wei

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <stdlib.h>
  5 #include <string>
  6 #include <memory>
  7 
  8 using namespace std;
  9 //定義各種變量
 10 int M, N, K, T;//每個司令部的初始生命元數量,城市數量,忠誠衰減量,截止時間量
 11 int r_n, b_n, r_w = 1, b_w = 1;//紅藍雙方的生命元數,紅藍雙方要制造的武士類型
 12 int d_str, n_str, i_str, l_str, w_str;//初始生命值
 13 int d_for, n_for, i_for, l_for, w_for;//攻擊力
 14 int strmin;//幾種武士中最小的生命值
 15 int hour, minute, _hour, _minute;//沒有_是現在時間,有_是限定時間
 16 int flag_redcreate, flag_bluecreate, flag_redtaken, flag_bluetaken;
 17 //武器
 18 class weapon {
 19 public:
 20     int num;
 21     string name;
 22 };
 23 //司令部
 24 class base
 25 {
 26 public:
 27     string type;
 28     int warriors;
 29     int locat;//所處地
 30     int d_n, n_n, i_n, l_n, w_n;
 31     int source;//生命元
 32 };
 33 //武士
 34 class warrior {
 35 public:
 36     int str;//生命值
 37     int id;//編號
 38     int forcew[4];
 39     string type;//種類
 40     weapon weapons[4];//三種類型的武器的數量 第四種是用過的arrow
 41     int force;//戰力
 42     int posi;//當前所在地點編號
 43     base*mast;//司令部
 44     int state;//狀態0:逃逸或死亡 1:存活
 45     int loyalty;//忠誠值
 46                 //總體初始化
 47     void mainset(base*a) {
 48         mast = a;
 49         id = (*a).warriors;
 50         posi = (*a).locat;
 51         state = 1;
 52         loyalty = 0;
 53         for (int i = 0; i <= 3; i++)
 54         {
 55             weapons[i].num = 0;
 56         }
 57     }
 58     void subset2() {
 59         for (int i = 0; i <= 3; i++)
 60             switch (i) {
 61             case 0: {weapons[i].name = "sword"; forcew[i] = force * 2 / 10; break; }
 62             case 1: {weapons[i].name = "bomb"; forcew[i] = force * 4 / 10;  break; }
 63             case 2: {weapons[i].name = "arrow"; forcew[i] = force * 3 / 10;  break; }
 64             case 3: {weapons[i].name = "arrow";  forcew[i] = force * 3 / 10; break; }
 65             }
 66     }
 67     //細化初始化
 68     virtual void rob(warrior*sb) {}
 69     virtual void subset() = 0;
 70     virtual void yell() {};
 71     virtual void attack(warrior*sb, int weaponid) {
 72         weapons[weaponid].num--;
 73         switch (weaponid) {
 74         case 0: {sb->str -= force * 2 / 10; weapons[weaponid].num++;  break; }
 75         case 1: {sb->str -= force * 4 / 10; str -= (force * 4 / 10) / 2; break; }
 76         case 2: {sb->str -= force * 3 / 10; weapons[3].num++; break; }
 77         case 3: {sb->str -= force * 3 / 10;  break; }
 78         }
 79     }
 80     virtual void toescape() {}
 81     //行軍
 82     void march();
 83     void die();
 84     void getweapon(warrior*sb) {
 85         int max0 = 10;
 86         for (int i = 0; i <= 3; i++)max0 -= weapons[i].num;
 87         for (int i = 0; i <= 3 && max0>0; i++) {
 88             for (int j = 1; j <= sb->weapons[i].num&&max0>0; j++) {
 89                 max0--;
 90                 weapons[i].num++;
 91             }
 92         }
 93     }
 94 };
 95 //城市
 96 class city {
 97 public:
 98     int soldier_n;
 99     warrior* red;
100     warrior* blue;
101 }allcity[30];
102 //行軍
103 void warrior::march() {
104     if (type == "iceman")
105     {
106         str -= str / 10;
107         if (str <= 0)
108             die();
109     }
110     if (type == "lion")
111         loyalty -= K;
112     if ((*mast).type == "red"&&state)
113         posi++;
114     else if ((*mast).type == "blue"&&state)
115         posi--;
116 }
117 void warrior::die() {
118     allcity[posi].soldier_n--;
119     if ((*mast).type == "red")
120         allcity[posi].red = NULL;
121     if ((*mast).type == "blue")
122         allcity[posi].blue = NULL;
123     posi = -1;
124     state = 0;
125 }
126 //武士-dragon
127 class dragon :public warrior {
128 public:
129     void subset() {
130         str = d_str;
131         type = "dragon";
132         weapons[id % 3].num++;
133         force = d_for;
134     }
135     void yell() {
136         printf("%03d:%02d %s dragon %d yelled in city %d\n", hour, minute, (*mast).type.c_str(), id, posi);
137     }
138 };
139 //武士-ninja
140 class ninja :public warrior {
141 public:
142     void subset() {
143         str = n_str;
144         type = "ninja";
145         weapons[id % 3].num++;
146         weapons[(id + 1) % 3].num++;
147         force = n_for;
148     }
149     void attack(warrior*sb, int weaponid) {
150         weapons[weaponid].num--;
151         switch (weaponid) {
152         case 0: {sb->str -= force * 2 / 10; weapons[weaponid].num++;   break; }
153         case 1: {sb->str -= force * 4 / 10;  break; }
154         case 2: {sb->str -= force * 3 / 10; weapons[3].num++; break; }
155         case 3: {sb->str -= force * 3 / 10;  break; }
156         }
157     }
158 };
159 //武士-iceman
160 class iceman :public warrior {
161 public:
162     void subset() {
163         str = i_str;
164         type = "iceman";
165         weapons[id % 3].num++;
166         force = i_for;
167     }
168     void yell() {}
169 };
170 //武士-wolf
171 class wolf :public warrior {
172 public:
173     void subset() {
174         str = w_str;
175         type = "wolf";
176         force = w_for;
177     }
178     void rob(warrior*sb)//搶奪武器
179     {
180         int max0 = 10;
181         for (int i = 0; i <= 3; i++)max0 -= weapons[i].num;
182         if (max0 && (sb->weapons[0].num + sb->weapons[1].num + sb->weapons[2].num + sb->weapons[3].num))
183         {
184             for (int i = 0; i <= 2; i++)
185             {
186                 if ((i == 0 || i == 1) && sb->weapons[i].num != 0) {
187                     int get = min(max0, sb->weapons[i].num);
188                     sb->weapons[i].num -= get;
189                     weapons[i].num += get;
190                     printf("%03d:%02d %s wolf %d took %d %s from %s %s %d in city %d\n", hour, minute, ((*mast).type).c_str(), id, get, weapons[i].name.c_str(), ((*(sb->mast)).type).c_str(), (sb->type).c_str(), sb->id, posi);
191                     break;
192                 }
193                 else if (i == 2) {
194                     int get = min(max0, sb->weapons[i].num + sb->weapons[i + 1].num);
195                     int extra = get - sb->weapons[i].num;
196                     if (extra > 0) {
197                         weapons[i].num += sb->weapons[i].num;
198                         weapons[3].num += extra;
199                         sb->weapons[i].num = 0;
200                         sb->weapons[i + 1].num -= extra;
201                     }
202                     else {
203                         sb->weapons[i].num -= get;
204                         weapons[i].num += get;
205                     }
206                     printf("%03d:%02d %s wolf %d took %d %s from %s %s %d in city %d\n", hour, minute, ((*mast).type).c_str(), id, get, weapons[i].name.c_str(), ((*(sb->mast)).type).c_str(), (sb->type).c_str(), sb->id, posi);
207                 }
208             }
209         }
210     }
211     void yell() {}
212 };
213 //武士-lion
214 class lion :public warrior
215 {
216 public:
217     void subset() {
218         str = l_str;
219         type = "lion";
220         force = l_for;
221         weapons[id % 3].num++;
222         loyalty = (*mast).source;
223     }
224     //逃跑
225     void toescape() {
226         state = 0;
227         if (posi <= N&&posi >= 1)
228         {
229             if ((*mast).type == "red")
230                 allcity[posi].red = NULL;
231             else if ((*mast).type == "blue")
232                 allcity[posi].blue = NULL;
233             allcity[posi].soldier_n--;
234         }
235         posi = -1;
236         printf("%03d:%02d ", hour, minute);
237         cout << (*mast).type;
238         printf(" lion %d ran away\n", id);
239     }
240     void yell() {}
241 };
242 //循環鏈表:制造武士
243 struct node {
244     char type;
245     node*next;
246 };
247 //又一波定義
248 warrior*redwaror[1000];
249 warrior*bluewaror[1000];
250 dragon d_r[100], d_b[100];
251 ninja n_r[100], n_b[100];
252 iceman i_r[100], i_b[100];
253 lion l_r[100], l_b[100];
254 wolf w_r[100], w_b[100];
255 base r;
256 base b;
257 node*red, *blue;
258 node redline, redline1, redline2, redline3, redline4, blueline, blueline1, blueline2, blueline3, blueline4;
259 void lineset() {
260     redline.type = 'i';
261     redline1.type = 'l';
262     redline2.type = 'w';
263     redline3.type = 'n';
264     redline4.type = 'd';
265     redline.next = &redline1;
266     redline1.next = &redline2;
267     redline2.next = &redline3;
268     redline3.next = &redline4;
269     redline4.next = &redline;
270     blueline.type = 'l';
271     blueline1.type = 'd';
272     blueline2.type = 'n';
273     blueline3.type = 'i';
274     blueline4.type = 'w';
275     blueline.next = &blueline1;
276     blueline1.next = &blueline2;
277     blueline2.next = &blueline3;
278     blueline3.next = &blueline4;
279     blueline4.next = &blueline;
280     red = &redline;
281     blue = &blueline;
282 }
283 //初始化
284 void mem() {
285     //司令部初始化
286     red = &redline;
287     blue = &blueline;
288     flag_bluecreate = 1, flag_redcreate = 1;
289     r.type = "red", b.type = "blue";
290     r.warriors = 0, b.warriors = 0;
291     r.locat = 0, b.locat = N + 1;
292     r.d_n = 0, r.i_n = 0, r.l_n = 0, r.n_n = 0, r.w_n = 0;
293     b.d_n = 0, b.i_n = 0, b.l_n = 0, b.n_n = 0, b.w_n = 0;
294     r.source = M, b.source = M;
295     flag_bluetaken = 0, flag_redtaken = 0;
296     //最小初始生命值初始化
297     strmin = min(d_str, i_str);
298     strmin = min(strmin, n_str);
299     strmin = min(strmin, l_str);
300     strmin = min(strmin, w_str);
301     //城市初始化
302     for (int i = 0; i <= N + 1; i++)
303     {
304         allcity[i].soldier_n = 0;
305         allcity[i].red = NULL;
306         allcity[i].blue = NULL;
307     }
308     //時間初始化
309     hour = 0, minute = 0;
310     _hour = T / 60, _minute = T % 60;
311 }
312 //輸入
313 void init() {
314     cin >> M >> N >> K >> T;
315     cin >> d_str >> n_str >> i_str >> l_str >> w_str;
316     cin >> d_for >> n_for >> i_for >> l_for >> w_for;
317 }
318 //制造武士
319 void createwarriors() {
320     if (flag_redcreate) {
321         switch ((*red).type) {
322         case 'i':
323             if (r.source >= i_str) {
324                 r.source -= i_str;
325                 r.i_n++;
326                 r.warriors++;
327                 i_r[r.i_n].mainset(&r);
328                 i_r[r.i_n].subset(); i_r[r.i_n].subset2();
329                 redwaror[r.warriors] = &i_r[r.i_n];
330                 printf("%03d:%02d red iceman %d born\n", hour, minute, r.warriors);
331                 allcity[0].soldier_n = 1;
332                 allcity[0].red = &i_r[r.i_n];
333                 break;
334             }
335             else {
336                 flag_redcreate = 0;
337                 break;
338             }
339         case 'l':
340             if (r.source >= l_str) {
341                 r.source -= l_str;
342                 r.l_n++;
343                 r.warriors++;
344                 l_r[r.l_n].mainset(&r);
345                 l_r[r.l_n].subset(); l_r[r.l_n].subset2();
346                 redwaror[r.warriors] = &l_r[r.l_n];
347                 printf("%03d:%02d red lion %d born\n", hour, minute, r.warriors);
348                 printf("Its loyalty is %d\n", l_r[r.l_n].loyalty);
349                 allcity[0].soldier_n = 1;
350                 allcity[0].red = &l_r[r.l_n];
351                 break;
352             }
353             else {
354                 flag_redcreate = 0;
355                 break;
356             }
357         case 'w':
358             if (r.source >= w_str) {
359                 r.source -= w_str;
360                 r.w_n++;
361                 r.warriors++;
362                 w_r[r.w_n].mainset(&r);
363                 w_r[r.w_n].subset(); w_r[r.w_n].subset2();
364                 redwaror[r.warriors] = &w_r[r.w_n];
365                 printf("%03d:%02d red wolf %d born\n", hour, minute, r.warriors);
366                 allcity[0].soldier_n = 1;
367                 allcity[0].red = &w_r[r.w_n];
368                 break;
369             }
370             else {
371                 flag_redcreate = 0;
372                 break;
373             }
374         case 'n':
375             if (r.source >= n_str) {
376                 r.source -= n_str;
377                 r.n_n++;
378                 r.warriors++;
379                 n_r[r.n_n].mainset(&r);
380                 n_r[r.n_n].subset(); n_r[r.n_n].subset2();
381                 redwaror[r.warriors] = &n_r[r.n_n];
382                 printf("%03d:%02d red ninja %d born\n", hour, minute, r.warriors);
383                 allcity[0].soldier_n = 1;
384                 allcity[0].red = &n_r[r.n_n];
385                 break;
386             }
387             else {
388                 flag_redcreate = 0;
389                 break;
390             }
391         case 'd':
392             if (r.source >= d_str) {
393                 r.source -= d_str;
394                 r.d_n++;
395                 r.warriors++;
396                 d_r[r.d_n].mainset(&r);
397                 d_r[r.d_n].subset(); d_r[r.d_n].subset2();
398                 redwaror[r.warriors] = &d_r[r.d_n];
399                 allcity[0].soldier_n = 1;
400                 allcity[0].red = &d_r[r.d_n];
401                 printf("%03d:%02d red dragon %d born\n", hour, minute, r.warriors);
402                 break;
403             }
404             else {
405                 flag_redcreate = 0;
406                 break;
407             }
408         }
409         red = red->next;
410     }
411     if (flag_bluecreate) {
412         switch ((*blue).type) {
413         case 'i':
414             if (b.source >= i_str) {
415                 b.source -= i_str;
416                 b.i_n++;
417                 b.warriors++;
418                 i_b[b.i_n].mainset(&b);
419                 i_b[b.i_n].subset(); i_b[b.i_n].subset2();
420                 bluewaror[b.warriors] = &i_b[b.i_n];
421                 printf("%03d:%02d blue iceman %d born\n", hour, minute, b.warriors);
422                 allcity[N + 1].soldier_n = 1;
423                 allcity[N + 1].blue = &i_b[b.i_n];
424                 break;
425             }
426             else {
427                 flag_bluecreate = 0;
428                 break;
429             }
430         case 'l':
431             if (b.source >= l_str) {
432                 b.source -= l_str;
433                 b.l_n++;
434                 b.warriors++;
435                 l_b[b.l_n].mainset(&b);
436                 l_b[b.l_n].subset(); l_b[b.l_n].subset2();
437                 bluewaror[b.warriors] = &l_b[b.l_n];
438                 printf("%03d:%02d blue lion %d born\n", hour, minute, b.warriors);
439                 printf("Its loyalty is %d\n", l_b[b.l_n].loyalty);
440                 allcity[N + 1].soldier_n = 1;
441                 allcity[N + 1].blue = &l_b[b.l_n];
442                 break;
443             }
444             else {
445                 flag_bluecreate = 0;
446                 break;
447             }
448         case 'w':
449             if (b.source >= w_str) {
450                 b.source -= w_str;
451                 b.w_n++;
452                 b.warriors++;
453                 w_b[b.w_n].mainset(&b);
454                 w_b[b.w_n].subset(); w_b[b.w_n].subset2();
455                 bluewaror[b.warriors] = &w_b[b.w_n];
456                 printf("%03d:%02d blue wolf %d born\n", hour, minute, b.warriors);
457                 allcity[N + 1].soldier_n = 1;
458                 allcity[N + 1].blue = &w_b[b.w_n];
459                 break;
460             }
461             else {
462                 flag_bluecreate = 0;
463                 break;
464             }
465         case 'n':
466             if (b.source >= n_str) {
467                 b.source -= n_str;
468                 b.n_n++;
469                 b.warriors++;
470                 n_b[b.n_n].mainset(&b);
471                 n_b[b.n_n].subset(); n_b[b.n_n].subset2();
472                 bluewaror[b.warriors] = &n_b[b.n_n];
473                 printf("%03d:%02d blue ninja %d born\n", hour, minute, b.warriors);
474                 allcity[N + 1].soldier_n = 1;
475                 allcity[N + 1].blue = &n_b[b.n_n];
476                 break;
477             }
478             else {
479                 flag_bluecreate = 0;
480                 break;
481             }
482         case 'd':
483             if (b.source >= d_str) {
484                 b.source -= d_str;
485                 b.d_n++;
486                 b.warriors++;
487                 d_b[b.d_n].mainset(&b);
488                 d_b[b.d_n].subset(); d_b[b.d_n].subset2();
489                 bluewaror[b.warriors] = &d_b[b.d_n];
490                 printf("%03d:%02d blue dragon %d born\n", hour, minute, b.warriors);
491                 allcity[N + 1].soldier_n = 1;
492                 allcity[N + 1].blue = &d_b[b.d_n];
493                 break;
494             }
495             else {
496                 flag_bluecreate = 0;
497                 break;
498             }
499         }
500         blue = blue->next;
501     }
502 }
503 //獅子逃跑
504 void lionsescape() {
505     for (int i = 0; i <= N + 1; i++) {
506         if (allcity[i].red != NULL)
507         {
508             if ((*allcity[i].red).type == "lion" && (*allcity[i].red).loyalty <= 0)
509                 (*allcity[i].red).toescape();
510         }
511         if (allcity[i].blue != NULL)
512         {
513             if ((*allcity[i].blue).type == "lion" && (*allcity[i].blue).loyalty <= 0)
514                 (*allcity[i].blue).toescape();
515         }
516     }
517 }
518 //行軍
519 void marching() {
520     for (int i = 0; i <= N + 1; i++) {
521         if (allcity[i].red)
522             allcity[i].red->march();
523         if (allcity[i].blue)
524             allcity[i].blue->march();
525     }
526     //清空城市指針
527     for (int i = 0; i <= N + 1; i++)
528         allcity[i].soldier_n = 0, allcity[i].blue = NULL, allcity[i].red = NULL;
529     for (int i = 1; i <= r.warriors; i++)
530     {
531         allcity[redwaror[i]->posi].soldier_n++;
532         allcity[redwaror[i]->posi].red = redwaror[i];
533     }
534     for (int i = 1; i <= b.warriors; i++)
535     {
536         allcity[bluewaror[i]->posi].soldier_n++;
537         allcity[bluewaror[i]->posi].blue = bluewaror[i];
538     }
539     for (int i = 0; i <= N + 1; i++) {
540         if (i == 0 && allcity[i].soldier_n) {
541             printf("%03d:%02d blue %s %d reached red headquarter with %d elements and force %d\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, allcity[i].blue->str, allcity[i].blue->force);
542             printf("%03d:%02d red headquarter was taken\n", hour, minute);
543         }
544         else if (i == N + 1 && allcity[i].soldier_n) {
545             printf("%03d:%02d red %s %d reached blue headquarter with %d elements and force %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].red->str, allcity[i].red->force);
546             printf("%03d:%02d blue headquarter was taken\n", hour, minute);
547         }
548         else {
549             if (allcity[i].red)
550                 printf("%03d:%02d red %s %d marched to city %d with %d elements and force %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, i, allcity[i].red->str, allcity[i].red->force);
551             if (allcity[i].blue)
552                 printf("%03d:%02d blue %s %d marched to city %d with %d elements and force %d\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, i, allcity[i].blue->str, allcity[i].blue->force);
553         }
554     }
555 }
556 //wolf搶武器 dangerous!
557 void wolfrobbing() {
558     for (int i = 1; i <= N; i++)
559     {
560         if (allcity[i].soldier_n == 2)
561         {
562             if (allcity[i].red&&allcity[i].red->type == "wolf")
563             {
564                 if (allcity[i].blue->type != "wolf")
565                     allcity[i].red->rob(allcity[i].blue);
566             }
567             else if (allcity[i].blue&&allcity[i].blue->type == "wolf")
568             {
569                 allcity[i].blue->rob(allcity[i].red);
570             }
571         }
572     }
573 }
574 //戰斗
575 void battle() {
576     for (int i = 1; i <= N; i++)
577     {
578         if (allcity[i].soldier_n == 2) {
579             int countr[4] = { allcity[i].red->weapons[0].num,allcity[i].red->weapons[1].num,allcity[i].red->weapons[2].num ,allcity[i].red->weapons[3].num };
580             int countb[4] = { allcity[i].blue->weapons[0].num,allcity[i].blue->weapons[1].num,allcity[i].blue->weapons[2].num ,allcity[i].blue->weapons[3].num };
581             while (1) {
582                 int weapr = -1, weapb = -1;
583                 int flagr = 0, flagb = 0;
584                 if (countr[0] + countr[1] + countr[2] + countr[3] == 0)
585                     for (int j = 0; j <= 3; j++)countr[j] = allcity[i].red->weapons[j].num;
586                 if (countr[1] + countr[2] + countr[3] == 0)flagr = 1;
587                 if (countb[0] + countb[1] + countb[2] + countb[3] == 0)
588                     for (int j = 0; j <= 3; j++)countb[j] = allcity[i].blue->weapons[j].num;
589                 if (countb[1] + countb[2] + countb[3] == 0)flagb = 1;
590                 for (int j = 0; j <= 1; j++) {
591                     if (countr[j])
592                     {
593                         weapr = j;
594                         countr[j]--;
595                         break;
596                     }
597                 }
598                 if (weapr == -1) {
599                     if (countr[3])
600                     {
601                         weapr = 3; countr[3]--;
602                     }
603                     else if (countr[2])
604                     {
605                         weapr = 2; countr[2]--;
606                     }
607                 }
608                 for (int j = 0; j <= 1; j++) {
609                     if (countb[j])
610                     {
611                         weapb = j;
612                         countb[j]--;
613                         break;
614                     }
615                 }
616                 if (weapb == -1) {
617                     if (countb[3])
618                     {
619                         weapb = 3; countb[3]--;
620                     }
621                     else if (countb[2])
622                     {
623                         weapb = 2; countb[2]--;
624                     }
625                 }
626                 if ((weapb == -1 && weapr == -1) || (weapr == 0 && weapb == 0 && allcity[i].red->forcew[weapr] == 0 && allcity[i].blue->forcew[weapb] == 0 && flagr&&flagb) || (flagb&&weapb == 0 && weapr == -1 && allcity[i].blue->forcew[weapb] == 0) || (flagr&&weapr == 0 && weapb == -1 && allcity[i].red->forcew[weapr] == 0))
627                 {
628                     printf("%03d:%02d both red %s %d and blue %s %d were alive in city %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i);
629                     break;
630                 }
631                 if (i % 2)
632                 {
633                     if (weapr >= 0)
634                     {
635                         allcity[i].red->attack(allcity[i].blue, weapr);
636                         if (allcity[i].blue->str <= 0 && allcity[i].red->str <= 0) {
637                             printf("%03d:%02d both red %s %d and blue %s %d died in city %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i);
638                             allcity[i].blue->die();
639                             allcity[i].red->die();
640                             break;
641                         }
642                         if (allcity[i].blue->str <= 0) {
643                             allcity[i].red->getweapon(allcity[i].blue);
644                             printf("%03d:%02d red %s %d killed blue %s %d in city %d remaining %d elements\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i, allcity[i].red->str);
645                             allcity[i].blue->die();
646                             break;
647                         }
648                         if (allcity[i].red->str <= 0) {
649                             allcity[i].blue->getweapon(allcity[i].red);
650                             printf("%03d:%02d blue %s %d killed red %s %d in city %d remaining %d elements\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, allcity[i].red->type.c_str(), allcity[i].red->id, i, allcity[i].blue->str);
651                             allcity[i].red->die();
652                             break;
653                         }
654                     }
655                     if (allcity[i].blue->str > 0 && weapb >= 0)
656                     {
657                         allcity[i].blue->attack(allcity[i].red, weapb);
658                         if (allcity[i].blue->str <= 0 && allcity[i].red->str <= 0) {
659                             printf("%03d:%02d both red %s %d and blue %s %d died in city %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i);
660                             allcity[i].blue->die();
661                             allcity[i].red->die();
662                             break;
663                         }
664                         if (allcity[i].red->str <= 0) {
665                             allcity[i].blue->getweapon(allcity[i].red);
666                             printf("%03d:%02d blue %s %d killed red %s %d in city %d remaining %d elements\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, allcity[i].red->type.c_str(), allcity[i].red->id, i, allcity[i].blue->str);
667                             allcity[i].red->die();
668                             break;
669                         }
670                         if (allcity[i].blue->str <= 0) {
671                             allcity[i].red->getweapon(allcity[i].blue);
672                             printf("%03d:%02d red %s %d killed blue %s %d in city %d remaining %d elements\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i, allcity[i].red->str);
673                             allcity[i].blue->die();
674                             break;
675                         }
676                     }
677                 }
678                 else {
679                     if (weapb >= 0)
680                     {
681                         allcity[i].blue->attack(allcity[i].red, weapb);
682                         if (allcity[i].blue->str <= 0 && allcity[i].red->str <= 0) {
683                             printf("%03d:%02d both red %s %d and blue %s %d died in city %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i);
684                             allcity[i].blue->die();
685                             allcity[i].red->die();
686                             break;
687                         }
688                         if (allcity[i].red->str <= 0) {
689                             allcity[i].blue->getweapon(allcity[i].red);
690                             printf("%03d:%02d blue %s %d killed red %s %d in city %d remaining %d elements\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, allcity[i].red->type.c_str(), allcity[i].red->id, i, allcity[i].blue->str);
691                             allcity[i].red->die();
692                             break;
693                         }
694                         if (allcity[i].blue->str <= 0) {
695                             allcity[i].red->getweapon(allcity[i].blue);
696                             printf("%03d:%02d red %s %d killed blue %s %d in city %d remaining %d elements\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i, allcity[i].red->str);
697                             allcity[i].blue->die();
698                             break;
699                         }
700                     }
701                     if (allcity[i].red->str > 0 && weapr >= 0)
702                     {
703                         allcity[i].red->attack(allcity[i].blue, weapr);
704                         if (allcity[i].blue->str <= 0 && allcity[i].red->str <= 0) {
705                             printf("%03d:%02d both red %s %d and blue %s %d died in city %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i);
706                             allcity[i].blue->die();
707                             allcity[i].red->die();
708                             break;
709                         }
710                         if (allcity[i].blue->str <= 0) {
711                             allcity[i].red->getweapon(allcity[i].blue);
712                             printf("%03d:%02d red %s %d killed blue %s %d in city %d remaining %d elements\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].blue->type.c_str(), allcity[i].blue->id, i, allcity[i].red->str);
713                             allcity[i].blue->die();
714                             break;
715                         }
716                         if (allcity[i].red->str <= 0) {
717                             allcity[i].blue->getweapon(allcity[i].red);
718                             printf("%03d:%02d blue %s %d killed red %s %d in city %d remaining %d elements\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, allcity[i].red->type.c_str(), allcity[i].red->id, i, allcity[i].blue->str);
719                             allcity[i].red->die();
720                             break;
721                         }
722                     }
723                 }
724             }
725             if (allcity[i].red && (allcity[i].red)->type == "dragon")
726                 allcity[i].red->yell();
727             if (allcity[i].blue && (allcity[i].blue)->type == "dragon")
728                 allcity[i].blue->yell();
729         }
730     }
731 }
732 //報告生命元數
733 void reportsource() {
734     printf("%03d:%02d %d elements in red headquarter\n", hour, minute, r.source);
735     printf("%03d:%02d %d elements in blue headquarter\n", hour, minute, b.source);
736 }
737 //武士報告
738 void reportwaror() {
739     for (int i = 0; i <= N + 1; i++) {
740         if (allcity[i].red)
741             printf("%03d:%02d red %s %d has %d sword %d bomb %d arrow and %d elements\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].red->weapons[0].num, allcity[i].red->weapons[1].num, allcity[i].red->weapons[2].num + allcity[i].red->weapons[3].num, allcity[i].red->str);
742         if (allcity[i].blue)
743             printf("%03d:%02d blue %s %d has %d sword %d bomb %d arrow and %d elements\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, allcity[i].blue->weapons[0].num, allcity[i].blue->weapons[1].num, allcity[i].blue->weapons[2].num + allcity[i].blue->weapons[3].num, allcity[i].blue->str);
744     }
745 }
746 int main()
747 {
748     int n;//case數
749     cin >> n;
750     lineset();
751     for (int c = 1; c <= n; c++) {
752         int a = 1;
753         init();
754         mem();
755         printf("Case %d:\n", c);
756         while (1) {
757             //0min
758             minute = 0;
759             if (hour == _hour&&minute > _minute)
760                 break;
761             createwarriors();
762             //5min
763             minute = 5;
764             if (hour == _hour&&minute > _minute)
765                 break;
766             lionsescape();
767             //10min
768             minute = 10;
769             if (hour == _hour&&minute > _minute)
770                 break;
771             marching();
772             if (allcity[0].soldier_n || allcity[N + 1].soldier_n)
773                 break;
774             //35min
775             minute = 35;
776             if (hour == _hour&&minute > _minute)
777                 break;
778             wolfrobbing();
779             //40min
780             minute = 40;
781             if (hour == _hour&&minute > _minute)
782                 break;
783             battle();
784             //50min
785             minute = 50;
786             if (hour == _hour&&minute > _minute)
787                 break;
788             reportsource();
789             //55min
790             minute = 55;
791             if (hour == _hour&&minute > _minute)
792                 break;
793             reportwaror();
794             hour++;
795         }
796     }
797     return 0;
798 }
View Code

其實有很多可以刪減的地方

有很多東西我寫上去都是后來沒用到或者沒必要的

但我懶得改了

可以試着把倆司令部弄成數組……會簡單很多……省去了各種分類討論……

但我懶得改了……

battle部分是我寫得最亂的地方

終極版再改吧 實在沒耐心了

老師說為了防止我們從2直接跳到終極感覺像重寫一樣加了3

表示對於我來說這只是增加了一個需要從頭寫起的任務而已


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM