본문 바로가기
Algorithm/BOJ

[BOJ] 7562번 나이트의 이동 java 풀이

by Ellery 2020. 11. 16.

https://www.acmicpc.net/problem/7562

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

class Pos{
  int x, y;

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

public class BJ_7562 {
  static int[] dx = {-2, -1, 1, 2, 2, 1, -1, -2};
  static int[] dy = {1, 2, 2, 1, -1, -2, -2, -1};
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int t = Integer.parseInt(br.readLine());
    Queue<Pos> q = new LinkedList<>();

    while (t-- > 0) {
      int n = Integer.parseInt(br.readLine());
      int[][] count = new int[n][n];
      for (int i = 0; i < n; i++) {
        Arrays.fill(count[i], -1);
      }
      String[] s1 = br.readLine().split(" ");
      String[] s2 = br.readLine().split(" ");
      int start_x = Integer.parseInt(s1[0]);
      int start_y = Integer.parseInt(s1[1]);
      int end_x = Integer.parseInt(s2[0]);
      int end_y = Integer.parseInt(s2[1]);


      Pos start = new Pos(start_x, start_y);
      Pos end = new Pos(end_x, end_y);
      q.add(start);
      count[start_x][start_y] = 0;

      while (!q.isEmpty()) {
        if (start_x == end_x && start_y == end_y) {
          break;
        }
        Pos p = q.remove();
        int x= p.x;
        int y = p.y;
        for (int i = 0; i < 8; i++) {
          int nx = x + dx[i];
          int ny = y + dy[i];
          if (0 <= nx && nx < n && 0 <= ny && ny < n) {
            if (count[nx][ny] == -1) {
              count[nx][ny] = count[x][y] + 1;
              q.add(new Pos(nx, ny));
            }
          }
        }
      }
      System.out.println(count[end.x][end.y]);
    }
  }
}
  • 전형적인 BFS 문제다.
  • 체스판 범위가 작아서 boolean 배열로 방문여부를 체크해놓고 전부 탐색, 페이즈가 1씩 증가할때마다 최적의 방문지는 전 이동지보다 1씩 카운트가 증가하고 그 값을 저장하는 카운트 2차원 행렬을 하나 만들어서 이동 가능한 지점을 모두 탐색한다. while문이 다 돌고 나면 행렬에는 칸 별로 이동하는데 걸리는 최소이동 횟수가 저장된다

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 4963번 섬의 개수 java 풀이  (0) 2020.11.16
[BOJ] 2178번 미로 탐색 java 풀이  (0) 2020.11.16
[BOJ] 7576번 토마토 java 풀이  (0) 2020.11.16
[BOJ] 16929번 Two Dots java 풀이  (0) 2020.11.16
[BOJ] 1662번 압축 Java 풀이  (0) 2020.11.16