
두 구역 사이의 최단거리를 구하므로 BFS를 사용했다.
지나온 거리의 개수를 저장하는 배열 dis를 생성해 최종 목적지에 도착하면 해당 위치의 dis를 반환하여 반환하는 방식으로 풀었다.
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[] r;
static int[][] map, dis;
static int[] dx = {-2, -2, 0, 0, 2, 2};
static int[] dy = {-1, 1, -2, 2, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
r = new int[4];
map = new int[N][N];
dis = new int[N][N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
r[i] = Integer.parseInt(st.nextToken());
}
int result = bfs();
System.out.println(result);
}
static int bfs() {
Queue<int[]> queue = new LinkedList<>();
boolean[][] visited = new boolean[N][N];
queue.offer(new int[]{r[0], r[1]});
visited[r[0]][r[1]] = true;
dis[r[0]][r[1]] = 0;
while (!queue.isEmpty()) {
int[] xy = queue.poll();
for (int i = 0; i < 6; i++) {
int nx = xy[0] + dx[i];
int ny = xy[1] + dy[i];
if (nx >= 0 && ny >= 0 && nx < N && ny < N && !visited[nx][ny]) {
dis[nx][ny] = dis[xy[0]][xy[1]] + 1;
visited[nx][ny] = true;
queue.offer(new int[]{nx, ny});
if (nx == r[2] && ny == r[3]) {
return dis[nx][ny];
}
}
}
}
return -1;
}
}
