#52784: 超詳細解題思路


ray2006950712@gmail.com (Ray Liu)

學校 : 國立中正大學
編號 : 190805
來源 : [118.171.163.106]
最後登入時間 :
2025-08-30 10:41:02

從左往右掃描

每進入一個新迴圈,stack 就 push 一個 Loop ( 一開始就要 push 一個 Loop )

 

Loop 有 5 個 fields:repeat_times、leading、start、end、distance

repeat_times 為重複次數

leading 為上一個迴圈最後的指針位置 ( 如果是連續迴圈如 LxLy,則剛好會是 None )

start 為該迴圈第一個指針位置,初始化為 None ( 因為還沒解析到第一個指針位置,所以初始化成 None )

end 為該迴圈目前指針位置,初始化為 None ( 初始化為 None 的原因同上 )

distance 為該迴圈指針走一次的距離,初始化為 0

其中 repeat_times 和 leading 要在解析迴圈 Lx 時就設定

 

【處理 T】

如果當前迴圈的 start 為 None,設定 start 的指針位置

這時不將指針距離差 加到當前迴圈的 distance,因為迴圈重複時不會把指針移到 leading,而是移到 start,故不累計

如果 start 不為 None,則將指針距離差 加到 distance

無論 start 是否為 None,都需要更新當前迴圈的 end 為新的指針位置

 

【處理 L】

建立新 Loop 並 push 進 stack

 

【處理 E】

pop 出 stack 最上面的 Loop ( 我叫他 popped )

並計算 popped 的總距離,為以下三個相加

(1) 進入迴圈時指針移動距離 = | start - leading | ( 如果 leading 不為 None )

(2) 迴圈 distance 重複的距離 = repeat_times * distance

(3) 迴圈指針回歸(rewind)重複的距離 = repeat_times * (| start - end |)

並將 popped 的總距離加到目前迴圈的 distance

接著檢查目前迴圈的 start 是否為 None,如果是,設定為 popped.start

最後更新目前迴圈的 end 為 popped.end