HDU 3830 Checkers
題意:
有三個棋子 可以隔一個棋子跳 不能隔兩個跳 問狀態u到狀態v最少跳幾步
思路:
對於一個狀態三個棋子的位置可以設為 x y z (小到大)
只有當y-x=z-y的時候 跳的方法為兩種 即 y跳過x 或 y跳過z
在上式等式不成立時 短的一邊可以跳許多次 直到大小關系改變
那麼這樣就形成了二叉樹的結構 我們將y向左右跳的狀態分別作為原狀態的兒子 將兩邊其中一個向中間跳的狀態作為原狀態的父親
那麼這時u和v的可達性就變成了 他們是不是同一個根 於是我們可以從u和v跳到頭 判斷一下
如果能跳 要跳幾次呢?? 這時利用LCA 方法與倍增法相同 即 u和v先爬到同一高度 再同時爬
爬的方法和剛才的狀態向根移動相同 由於沒有倍增打表 因此同一深度後我們要用二分法確定爬的高度
代碼:
#include
#include
#include
#include
#include
#include