くしらくんの移動方法から、なるべく最短となる距離でゴールへ移動することを考えればよいことが分かります。
このグリッドでは上下左右がつながっているので、縦方向の最短距離は、とすると、 です。
同様に横方向の最短距離は、とすると、 です。
また、縦に 、横に の距離がある場合には、斜め移動を 回した方が横移動を 回行うよりもコストが低いです。
よって、斜め移動をする回数は 回、横移動をする回数は 回です。
最終的なコストは です。
以上より各テストケースについて で答えることができるので、 で解くことが出来ます。
t = int(input()) for _ in range(t): h, w, sx, sy, gx, gy = map(int,input().split()) dx = abs(gx - sx) dy = abs(gy - sy) dx = min(dx, h-dx) dy = min(dy, w-dy) ans = 3 * min(dx, dy) + 2 * (max(dx, dy) - min(dx, dy)) print(ans)
#include<bits/stdc++.h> using namespace std; using ll = long long; ll solve(ll sx, ll sy, ll gx, ll gy) { ll dx = abs(sx - gx), dy = abs(sy - gy); return min(dx, dy) * 3 + (max(dx, dy) - min(dx, dy)) * 2; } int main() { int q; cin >> q; for (int i = 0; i < q; i++) { ll h, w, sx, sy, gx, gy; cin >> h >> w >> sx >> sy >> gx >> gy; ll ans = 8e18; for (ll dx = -1; dx <= 1; dx++) { for (ll dy = -1; dy <= 1; dy++) { ans = min(ans, solve(sx, sy, gx + h * dx, gy + dy * w) ); } } cout << ans << endl; } }