본문 바로가기
자바 알고리즘/백준

백준 7565 : 나이트의 이동

by hoshi03 2024. 4. 10.

문제

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

입력

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

각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.

출력

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

예제 입력 1 복사

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

예제 출력 1 복사

5
28
0

 

• 풀이

 

미로 탐색과 거의 비슷하고, 여긴 갈수 있는칸 없는칸이 없어서 풀긴 더 수월했다

인풋 받는데서 한자리만 오는줄 알고 s.charAt(0), s.charAt(0)으로 했다가 "30 50" 받을때 공백이 들어가서

StringTokenizer로 수정했다.. 인풋 받는 방법도 좀 더 찾아봐야겠다

import java.util.*;
import java.io.*;

public class Main{

    static int T, N, startX, startY, targetX, targetY;;

    static String s;
    static StringTokenizer st;

    static int[][] board;
    static boolean[][] visit;
    static int[][] dist;

    static int[][] dir = {{2,1}, {1,2}, {-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};

    static void bfs(int x, int y){
        Queue<Integer> queue = new LinkedList<>();
        queue.add(x);
        queue.add(y);
        visit[x][y] = true;
        dist[x][y] = 0;

        while (!queue.isEmpty()){
            x = queue.poll();
            y = queue.poll();
            // 나이트는 8방향 dir로 이동 가능하다
            for (int i = 0; i < 8; i++){
                int dx = x + dir[i][0];
                int dy = y + dir[i][1];
                if (dx < 0 || dy < 0 || dx >= N || dy >= N) continue;
                if (visit[dx][dy]) continue;
                queue.add(dx);
                queue.add(dy);
                visit[dx][dy]= true;
                dist[dx][dy] = dist[x][y] +1;
            }
        }
    }


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(br.readLine());

        while (T-- > 0){
            N = Integer.parseInt(br.readLine());
            board = new int[N][N];
            visit = new boolean[N][N];
            dist = new int[N][N];
            s = br.readLine();
            st = new StringTokenizer(s);
            startX = Integer.parseInt(st.nextToken());
            startY = Integer.parseInt(st.nextToken());
            s = br.readLine();
            st = new StringTokenizer(s);
            targetX = Integer.parseInt(st.nextToken());
            targetY = Integer.parseInt(st.nextToken());
            bfs(startX,startY);
            System.out.println(dist[targetX][targetY]);
        }
    }
}

'자바 알고리즘 > 백준' 카테고리의 다른 글

백준 1697 : 숨바꼭질  (0) 2024.04.11
백준 18404 : 현명한 나이트  (0) 2024.04.10
백준 2178 : 미로 탐색  (0) 2024.04.10
백준 2251 : 물통  (0) 2024.04.10
백준 11725 : 트리의 부모  (0) 2024.04.09