-
结论题
-
题目思路:
-
将起点移动到终点一列或者一行(台阶型移动,因为“相邻两步不能向同一个方向走!”),但是这里要特判一下是走到同一列短,还是同一行短。
-
判断过后,就把起点移过去,由于这里是台阶型所以\(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;
}