#16393: C的解題思路


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
a822. 5.滾球遊戲 -- 101學年度桃竹苗區資訊學科能力競賽 | From: [27.52.77.116] | 發表日期 : 2018-12-28 15:28

這題重點有兩個:建造遊戲盤、球的滾動

第一個:建造遊戲盤

可以在全域範圍用二維陣列儲存,一維也可以,至於走法以一維思考較容易

以 index 代表目前陣列的位置,R 列 C 行轉換成 index => index = R * N + C

從題目給定起點開始,array [ index ] = t =1 ,則下一格就是 index + t

找到後若 index 超過陣列大小 N*N,index 就 %= N*N,同時 array [ index ] = ++ t

迴圈直到填滿就完成遊戲盤

PS: R =  index / N  、 C =  index % N

第二個:球的滾動

這裡用遞迴函式解決,虛擬碼如下:

int 滾動(int 目前索引, int 棋盤邊長)
{
    若當前上/下/左/右未超過邊界
        用陣列紀錄此棋盤值
    for(陣列)
    {
        若上/下/左/右存在 且 比目前最小值還小
        {
            最小值 = 該陣列元素
            紀錄方向
        }
    }
    若目前棋盤值比相鄰的最小值還小
        return 目前索引
    否則
    {
        switch(方向)
        {
            case 上/下/左/右: 方向索引= 目前索引 - 邊長/ + 邊長 / -1 / +1
        }
        return 滾動( 方向索引, 棋盤邊長)
    }
}

只要每個點用函式找,從 A 滾到 B ,B 的球數 +1 

所有球滾完後,再計算有球的格子數跟最大球數就好

 
ZeroJudge Forum