고코딩

[백준 16748번] 데스 나이트 본문

코딩테스트

[백준 16748번] 데스 나이트

고코딩 2021. 1. 27. 13:05

문제

게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다.

크기가 N×N인 체스판과 두 칸 (r1, c1), (r2, c2)가 주어진다. 데스 나이트가 (r1, c1)에서 (r2, c2)로 이동하는 최소 이동 횟수를 구해보자. 체스판의 행과 열은 0번부터 시작한다.

데스 나이트는 체스판 밖으로 벗어날 수 없다.

입력

첫째 줄에 체스판의 크기 N(5 ≤ N ≤ 200)이 주어진다. 둘째 줄에 r1, c1, r2, c2가 주어진다.

출력

첫째 줄에 데스 나이트가 (r1, c1)에서 (r2, c2)로 이동하는 최소 이동 횟수를 출력한다. 이동할 수 없는 경우에는 -1을 출력한다.


정답

간단하게 깊이 우선 탐색으로 풀면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    static int[][] map;
    static boolean [][] visited;
    static int[] dx = {-2,-2,0,0,2,2};
    static int[] dy = {-1,1,-2,2,-1,1};
    static class RC{
        int r,c;
        public RC(int r, int c) {
            this.r = r;
            this.c = c;
        }
    }
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());    //체스판 크기
        map = new int[n][n];
        visited = new boolean[n][n];

        String[] XY = br.readLine().split(" ");
        int r1 = Integer.parseInt(XY[0]);
        int c1 = Integer.parseInt(XY[1]);
        int r2 = Integer.parseInt(XY[2]);
        int c2 = Integer.parseInt(XY[3]);

        Queue<RC> que = new LinkedList<RC>();
        que.add(new RC(r1,c1));
        map[r1][c1] = 0;
        visited[r1][c1] = true;
        boolean can = false;

        while(!que.isEmpty()) {
            RC now = que.poll();
            //지금 방문한 칸이 목표 칸이면 break;
            if(now.r == r2 && now.c == c2) {
                can = true;
                break;
            }
            visited[now.r][now.c] = true;
            //이동할수 있는 칸 탐색
            for(int i=0;i<6;i++) {
                int nr = now.r + dx[i];
                int nc = now.c + dy[i];
                //범위 밖이면 무시
                if(nr >=n || nc >=n || nr <0 || nc<0) continue;
                //범위 안이면 방문했는지 아닌지 판단
                if(visited[nr][nc]) continue;
                //방문 안했으면 체크
                visited[nr][nc] = true;
                map[nr][nc] = map[now.r][now.c]+1;
                que.add(new RC(nr,nc));
            }
        }
        if(can) {
            System.out.println(map[r2][c2]);
        }else {
            System.out.println("-1");
        }
        br.close();
    }
}

'코딩테스트' 카테고리의 다른 글

[백준 14502번] 연구소(java)  (1) 2021.01.29
[백준 16928번] 뱀과 사다리 게임  (0) 2021.01.27
[백준 16947번] 서울 지하철 2호선  (0) 2021.01.19
[백준 16929번] Two Dots  (0) 2021.01.19
[백준 1697번] 숨바꼭질  (0) 2021.01.19