[7562 - JAVA] 나이트의 이동

2024. 1. 24. 11:02Algorithm

 

문제

 

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?

 

 

입력

 

입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.

각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다.

 

체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.

 

출력

 

각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.

 

정답

 

import java.util.*;

public class Main {

    public static int t, l, sx,sy, ex, ey;
    public static boolean[][] visited;

    // 왼쪽 상단부터 시계방향으로 이동
    public static int[] dx = new int[]{-1, -2, -2, -1, 1, 2, 2, 1};
    public static int[] dy = new int[]{-2, -1, 1, 2, 2, 1, -1, -2};
    public static int bfs(int x, int y) {

        Queue<int[]> q = new LinkedList<>();
        q.add(new int[]{x, y, 0});

        visited = new boolean[l][l];

        while (!q.isEmpty()) {
            int[] now = q.poll();
            int nx = now[0];
            int ny = now[1];
            int move = now[2];

            // 도착
            if (nx == ex && ny == ey) {
                return move;
            }

            for (int i = 0; i < 8; i++) {
                int nnx = nx + dx[i];
                int nny = ny + dy[i];

                if (nnx >= 0 && nnx < l && nny >= 0 && nny < l) {
                    if (!visited[nnx][nny]) {
                        visited[nnx][nny] = true;
                        q.add(new int[]{nnx, nny, move + 1});
                    }
                }
            }

        }
        return -1;
    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        t = sc.nextInt();

        for (int i = 0; i < t; i++) {

            l = sc.nextInt();

            sx = sc.nextInt();
            sy = sc.nextInt();

            ex = sc.nextInt();
            ey = sc.nextInt();

            System.out.println(bfs(sx, sy));

        }

    }

}

 

오랜만에 풀어서 그런가 조금 헷갈렸다 전형적인 bfs 문제로 이코테의 왕실의 나이트 문제와 어쩌면 유사할지도? 이코테의 경우 나이트의 이동 가능 범위만 구하는거라 훨씬 쉽지만 

'Algorithm' 카테고리의 다른 글

[13305 - JAVA] 주유소  (1) 2024.03.12
[15649 - JAVA] N과 M (1)  (0) 2024.03.12
[2667 - JAVA] 단지번호붙이기  (0) 2024.01.15
[2606 - JAVA] 바이러스  (0) 2024.01.15
[1541 - JAVA] 잃어버린 괄호  (0) 2024.01.02