1. 程式人生 > 其它 >題解 P7885 「MCOI-06」Flight

題解 P7885 「MCOI-06」Flight

題目由此去


  • 結論題

  • 題目思路:

  1. 將起點移動到終點一列或者一行(臺階型移動,因為“相鄰兩步不能向同一個方向走!”),但是這裡要特判一下是走到同一列短,還是同一行短。

  2. 判斷過後,就把起點移過去,由於這裡是臺階型所以\(ans*=2\)

  3. 再來一個特判,判斷最後在同一行/列走到終點有多少格。

令 $ 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;
}