這一題我認為很水耶~可能是因為是最後一題+過長又機車的題目所以沒甚麼人嘗試解這一題。
好的~這一題真的沒甚麼好說的...主要就是考程式的基本設計架構而已。
首先我們來設定一些變數:
S:排程的字串
f[][]:敵人的血量值,是一個3*3的二維陣列(為方便設全域變數)
MP、C、ATK、MH:如題目所述
接著設定一些函數:
attack(x,y,i):對(x,y)的敵人造成i點傷害
complete():判斷場上還有沒有敵人
來大概講解架構:首先把該輸入的輸入,接著用for迴圈跑過S,在每次迴圈中要做的事大概長這樣:
1. 瞄準:兩層for迴圈跑過f,i從大~小,j從小~大,找f[j][i]是不是 = 0,如果不等於就瞄準他(想想為什麼?),用兩個變數x,y紀錄瞄準對象。
2. 判斷:判斷當前的動作是什麼,並做出對應的動作。
B:執行attack(x,0~2,ATK*(1+0.2*C)),C歸零。
b:執行attack(0~2,y,ATK*(1+0.2*C)),C歸零。
C:執行attack(x,y,ATK),C+1,MP+2。
A:執行attack(x,y,ATK),MP + (20 + 2*C),C歸零。
3. Magia:如果MP >= 100,attack(0~2,0~2,MH),MP歸零。
4. 結束判斷:執行complete(),如果沒人就輸出答案(應為目前index+1),然後結束程式。
然後是attack()和complete()的部分,應該不難吧。complete()只要跑過f,發現不是0馬上回傳0(或1)就好了。
至於attack()的部分只是減法而已,但為了避免有負數影響判斷,要把負數變0。
總之,這題就這麼結束了~(耶),當然這一題有很多寫法,不見得要照我的作法,自己舒服+AC就好。
還有一個小陷阱就是沒有敵人的時候,所以在輸入完之後先檢查看看是不是這個情況。這個技巧叫做「特殊判斷(特判)」,是競賽中常見的技巧。
還好本題在範例測資就有好心提醒了,通常比賽中出題人都會故意隱藏這種小陷阱,讓你百思不得其解的一直WA,所以說比賽也要有足夠的觀察力!
最後的最後,這個遊玩機制還有劇情是不是有點熟悉,沒錯,就是魔法紀錄!這是我在刷活動的時候突發奇想的 :P
(回去繼續刷拉)