這題重點有兩個:建造遊戲盤、球的滾動
第一個:建造遊戲盤
可以在全域範圍用二維陣列儲存,一維也可以,至於走法以一維思考較容易
以 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
所有球滾完後,再計算有球的格子數跟最大球數就好