题意:
有三个棋子 可以隔一个棋子跳 不能隔两个跳 问状态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