나이트의이동


백준 7562: 나이트의 이동

문제보기
Alt text

풀이

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);
			}
		}
	}
}