[백준 | Java] 16948 데스나이트

알린·2024년 5월 20일

baekjoon

목록 보기
57/68

내 풀이

두 구역 사이의 최단거리를 구하므로 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;
    }
}

profile
짱이 되고싶은 개발 기록

0개의 댓글