題解 P7885 「MCOI-06」Flight
阿新 • • 發佈:2021-10-04
-
結論題
-
題目思路:
-
將起點移動到終點一列或者一行(臺階型移動,因為“相鄰兩步不能向同一個方向走!”),但是這裡要特判一下是走到同一列短,還是同一行短。
-
判斷過後,就把起點移過去,由於這裡是臺階型所以\(ans*=2\)
-
再來一個特判,判斷最後在同一行/列走到終點有多少格。
令 $ len= $ 走到終點的格子數
\(\begin{cases}ans+=len*2&len \in N,x \mid x=2*len \\ans+=len*2-1&len \in Z,x \mid x=2*len+1\end{cases}\)
偶數情況:
奇數情況:
AC程式碼如下:
#include<bits/stdc++.h> #define int unsigned long long using namespace std; long long a,b,c,d; signed main() { int t; cin>>t; while(t--) { scanf("%lld%lld%lld%lld",&a,&b,&c,&d); int ac = abs(a - c); int bd = abs(b - d); int ans = min(ac, bd); ac -= ans; bd -= ans; ans *= 2; if(!ac && !bd) { printf("%lld\n", ans); continue; } if(ac) { if(ac % 2) ans-- ; ans += 2 * ac; } if(bd) { if(bd % 2) ans-- ; ans += 2 * bd; } printf("%lld\n", ans); } return 0; }