나이트의이동
백준 7562: 나이트의 이동
풀이
BFS 이용
소스코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static class Node {
int r, c, cnt;
Node(int r, int c, int cnt) {
this.r = r;
this.c = c;
this.cnt = cnt;
}
}
static int[] dr = { -1, -2, -2, -1, 1, 2, 2, 1 };
static int[] dc = { -2, -1, 1, 2, -2, -1, 1, 2 };
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 1; tc <= T; tc++) {
int L = sc.nextInt();
int[][] map = new int[L][L];
boolean[][] visited = new boolean[L][L];
Node Start = new Node(sc.nextInt(), sc.nextInt(), 0); // 시작위치
Node End = new Node(sc.nextInt(), sc.nextInt(), 0); // 도착위치
// 시작위치와 도착위치가 같다면 이동횟수는 0이다.
if (Start.r == End.r && Start.c == End.c) {
System.out.println("0");
} else {
Queue<Node> queue = new LinkedList<>();
queue.add(new Node(Start.r, Start.c, 0));
visited[Start.r][Start.c] = true;
int min = Integer.MAX_VALUE;
while (!queue.isEmpty()) {
Node node = queue.poll();
for (int d = 0; d < 8; d++) {
int nr = node.r + dr[d];
int nc = node.c + dc[d];
if (nr >= 0 && nc >= 0 && nr < L && nc < L && !visited[nr][nc]) {
if (nr == End.r && nc == End.c) { // 이동하려는 칸에 도착
min = Math.min(min, node.cnt + 1);
} else {
visited[nr][nc] = true;
queue.add(new Node(nr, nc, node.cnt + 1));
}
}
}
}
System.out.println(min);
}
}
}
}