問題重述
從 x 出發,通過乘法/除法(中間結果指數必為正整數)得到 xⁿ。求最少運算步數。n ≤ 1000。
IDA* 搜索框架
迭代加深深度優先搜索:從 depth=1 開始遞增深度限制,每輪 DFS 搜索深度不超過當前限制的解。找到解即為最優(因深度遞增)。
狀態表示與剪枝
- 數組 `a[depth]` 存儲已生成的指數值,`a[1]=1`
- 第 `pos` 步可由前 `pos` 個值兩兩加減生成新值:`a[pos]+a[i]` (乘法) 或 `a[pos]-a[i]` (除法),i=1..pos
- 關鍵剪枝:`a[pos] << (max_depth - pos) < n`。即使之後每步都乘 2(左移),也無法達到 n,直接回溯。此剪枝極其有效。
- 限制生成值在 [1, 2000) 範圍內
正確性與效率
搜索空間較小,IDA* 配合指數增長剪枝能快速解決 n≤1000 所有情況。樣例 31→6, 512→9 均正確。