<BOJ>7562번: 나이트의 이동

문제


7562번: 나이트의 이동

접근

  • BFS의 틀을 알면 바로 풀 수 있는 문제 중의 하나다.
  • dx[], dy[]로 나이트의 이동 방향을 미리 초기화 한다.
  • Flood Fill을 통해 목표 지점까지의 거리를 계산하면 된다.

내 코드

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

public class Main {
    static StringTokenizer st;
    static int[] dx = {1,2,2,1,-1,-2,-2,-1};
    static int[] dy = {-2,-1,1,2,2,1,-1,-2};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int tc = Integer.parseInt(br.readLine());
        while (tc-- > 0) {
            int n = Integer.parseInt(br.readLine());
            int[][] arr = new int[n][n];

            st = new StringTokenizer(br.readLine());
            Node start = new Node(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
            st = new StringTokenizer(br.readLine());
            Node end = new Node(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));

            bfs(arr, start, end);
        }
    }

    public static void bfs(int[][] dist, Node start, Node end) {
        Queue<Node> q = new LinkedList<>();
        boolean[][] isVisited = new boolean[dist.length][dist.length];
        q.add(start);
        isVisited[start.getX()][start.getY()] = true;

        while (!q.isEmpty()) {
            Node cur = q.poll();
            if (cur.getX() == end.getX() && cur.getY() == end.getY()) {
                System.out.println(dist[cur.getX()][cur.getY()]);
                return;
            }

            for (int i = 0; i < 8; i++) {
                int nx = cur.getX() + dx[i];
                int ny = cur.getY() + dy[i];
                if (nx >= 0 && nx < dist.length && ny >= 0 && ny < dist.length && !isVisited[nx][ny]) {
                    isVisited[nx][ny] = true;
                    dist[nx][ny] = dist[cur.getX()][cur.getY()] + 1;
                    q.add(new Node(nx, ny));
                }
            }
        }
    }

    static class Node {
        private int x; private int y;

        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }
    }
}

좋은 웹페이지 즐겨찾기