미로 최단거리 경로

문제

설명

7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력하는 프로그램을 작성하세요.

경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다.

출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 도로이다.

격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면

https://cote.inflearn.com/public/upload/88ff3b120f.jpg

위와 같은 경로가 최단 경로의 길이는 12이다.

입력

첫 번째 줄부터 7*7 격자의 정보가 주어집니다.

출력

첫 번째 줄에 최단으로 움직인 칸의 수를 출력한다. 도착할 수 없으면 -1를 출력한다.

예시 입력 1

0 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 1 0 0 0
1 1 0 1 0 1 1
1 1 0 1 0 0 0
1 0 0 0 1 0 0
1 0 1 0 0 0 0

예시 출력 1

12

해결방법

  • BFS → 최단거리를 구할 때는 큐를 이용하여 큐에 현재 좌표 저장 → 큐에서 좌표 빼낸 후에 다음에 갈 수 있는 좌표 저장 방식으로 진행한다.
  • 레벨 탐색을 진행하는 방법과 동일해 진다.
  • 길이를 체크하는 것은 큐에 방문 좌표 넣을 때 마다 +1 씩 하며 해당 길이에 대한 저장은 좌표 위치에 +1 씩 증가시켜가면 마지막 길이 체크만 하면 된다.

코드

import java.util.*;

class Point {
    public int x, y;

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

class Main {
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    static int[][] board, dis;

    public void BFS(int x, int y) {
        Queue<Point> Q = new LinkedList<>();
        // 큐에 현재 좌표를 저장하고 시작.
        Q.offer(new Point(x, y));
        board[x][y] = 1;
        // 큐가 빌 때까지 수행
        while (!Q.isEmpty()) {
            // 큐에서 좌표를 하나 뽑음.
            Point tmp = Q.poll();
            // 상하좌우 체크 후, 이동할 좌표 선택 후 진행.
            for (int i = 0; i < 4; i++) {
                int nx = tmp.x + dx[i];
                int ny = tmp.y + dy[i];
                if (nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0) {
                    board[nx][ny] = 1;
                    Q.offer(new Point(nx, ny));
                    dis[nx][ny] = dis[tmp.x][tmp.y] + 1;
                }
            }
        }
    }

    public static void main(String[] args) {
        Main.Main T = new Main.Main();
        Scanner kb = new Scanner(System.in);
        board = new int[8][8];
        dis = new int[8][8];
        for (int i = 1; i <= 7; i++) {
            for (int j = 1; j <= 7; j++) {
                board[i][j] = kb.nextInt();
            }
        }
        T.BFS(1, 1);
        if (dis[7][7] == 0) System.out.println(-1);
        else System.out.println(dis[7][7]);
    }
}

© 2024. Chiptune93 All rights reserved.