#51: 解題報告:希望與絕望


810848 (路過)

School : 一中
ID : 96
IP address : [162.158.119.113]
Last Login :
2021-04-17 17:30:36
c037. x.希望與絕望 $(Record)$ -- 臺中一中電腦資訊研習社 | From: [162.158.119.157] | Post Date : 2021-01-08 19:07

這一題我認為很水耶~可能是因為是最後一題+過長又機車的題目所以沒甚麼人嘗試解這一題。

 

好的~這一題真的沒甚麼好說的...主要就是考程式的基本設計架構而已。

 

首先我們來設定一些變數:

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

(回去繼續刷拉)

 

 

 

 

 
ZeroJudge Forum