將三顆棋子看作三元組 \((x,y,z)\ x,得其能轉移到的狀態有:
\[\large\begin
&(2x-y,x,z) \\
&(x,z,2z-y) \\
&(x,2y-z,y)\ (y-x>z-y) \\
&(y,2y-x,z)\ (y-x
後兩個轉移只會滿足其中乙個,那麼將中間棋子向兩邊跳看作左右兒子,兩邊棋子向中間跳看作父親,根節點為滿足 \(y-x=z-y\) 的狀態,那麼每個狀態都唯一對應一棵二叉樹。
到樹上的 \(lca\) 即為最小步數,可以通過除來加快跳父親的過程,然後二分找 \(lca\) 即可。
#include#define inf 1000000000
using namespace std;
templateinline void read(t &x)
while(isdigit(c))
if(flag)x=-x;
}int dep;
struct node
; sort(a,a+3),x=a[0],y=a[1],z=a[2];
}}s,t;
bool operator == (const node &a,const node &b)
node find(node p,int d,int goal)
if(d1>d2)
,d+v,goal);
}int v=min(d2/d1-(d2%d1==0),goal-d);
return find((node),d+v,goal);
}int calc()
return abs(d1-d2)+dis*2;
}int main()
P1497 洛谷 P1852跳跳棋
標籤 空格分隔 資訊 圖論 二分 洛谷 考題,看到就覺得是不可能寫出來的那種,於是打了個bfs直接走人。考完之後聽呂大佬講過之後覺得此題可謂絕妙啊 屁顛屁顛地跑去寫之後才發現思路出來了 也並不好些。題面 看到覺得和倒油很像,一看資料範圍嚇死人,109109 搜尋不可能了 看著和log有關,仔細分析一...
洛谷 P1852 國家集訓隊 跳跳棋
跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不變。一...
P1852 國家集訓隊 跳跳棋
原 奇怪的字串 請前往 p2543 跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸...