module main; // 2次元グリッド、8近傍、幅優先探索 import std; alias P = Tuple!(int, "r", int, "c"); void main() { // 入力 P king; readln.chomp.formattedRead("%d %d", king.r, king.c); P pawn; readln.chomp.formattedRead("%d %d", pawn.r, pawn.c); // 答えの計算と出力 int[int][int] dist; dist[0][0] = 0; auto que = DList!P(P(0, 0)); while (!que.empty) { P cur = que.front; que.removeFront; foreach (dr; [-1, 0, 1]) { foreach (dc; [-1, 0, 1]) { if (dr == 0 && dc == 0) continue; int nr = cur.r + dr, nc = cur.c + dc; if (nr == pawn.r && nc == pawn.c) continue; if (nr !in dist || nc !in dist[nr]) { dist[nr][nc] = dist[cur.r][cur.c] + 1; // 目的地に到達した場合 if (nr == king.r && nc == king.c) { writeln(dist[nr][nc]); return; } que.insertBack(P(nr, nc)); } } } } }