[BOJ] 2178. 미로탐색

2022. 12. 11. 16:34·algorithm

문제

N×M크기의 배열로 표현되는 미로가 있다.


미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.


위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.


입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.


출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.


해결 방법

  • dfs나 bfs를 사용하는 문제
  • 노드가 아닌 이차원 배열로 주어지므로 미로와 방문처리는 이차원 배열로 선언한다.
  • 상하좌우를 탐색할 배열을 생성한다.
  • bfs를 할 때 상하좌우도 탐색하여 아직 방문하지 않았고 미로의 해당 위치가 1이면 그 위치에 방문하고 map의 그 위치에 +1을 한다.
    • 지금 위치의 경로의 수는 이전 경로의 수에 +1을 하면 구할 수 있기 때문이다.
  • 이 경로의 수는 항상 최소다.
  • 도착위치의 값을 출력한다.

코드

// 미로 탐색
public class Week08_2178 {
    static int w;
    static int h;
    static int map[][];
    static boolean[][] visited;
    static int[] dx = {0, -1, 0, 1}; // 상좌하우
    static int[] dy = {-1, 0, 1, 0};

    public static void main(String[] args) throws IOException {
        input();
        bfs();
        System.out.println(map[h - 1][w - 1]);
    }

    private static void bfs() {
        visited[0][0] = true;
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{0, 0});
        while (!queue.isEmpty()) {
            int[] temps = queue.poll();
            for (int i = 0; i < 4; i++) {
                int newH = temps[0] + dy[i];
                int newW = temps[1] + dx[i];
                if (newH >= 0 && newW >= 0 && newH < h && newW < w) {
                    if (!visited[newH][newW] && map[newH][newW] == 1) {
                        queue.add(new int[]{newH, newW});
                        map[newH][newW] = map[temps[0]][temps[1]] + 1; // 이전 출발지점 + 1을 해서 map의 각 자리에 거리 계산
                        visited[newH][newW] = true;
                    }
                }
            }
        }
    }

    private static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        h = Integer.parseInt(st.nextToken());
        w = Integer.parseInt(st.nextToken());
        map = new int[h][w];
        visited = new boolean[h][w];

        for (int i = 0; i < h; i++) {
            String[] temp = br.readLine().split("");
            for (int j = 0; j < w; j++) {
                map[i][j] = Integer.parseInt(temp[j]);
            }
        }
    }
}
저작자표시 (새창열림)

'algorithm' 카테고리의 다른 글

[BOJ] 4963. 섬의 개수  (0) 2022.12.11
[BOJ] 5567. 결혼식  (0) 2022.12.11
[BOJ] 1303. 전쟁 - 전투  (0) 2022.12.11
[BOJ] 2606. 바이러스  (0) 2022.12.11
[BOJ] 1743. 음식물 피하기  (1) 2022.12.09
'algorithm' 카테고리의 다른 글
  • [BOJ] 4963. 섬의 개수
  • [BOJ] 5567. 결혼식
  • [BOJ] 1303. 전쟁 - 전투
  • [BOJ] 2606. 바이러스
siio
siio
  • siio
    siio's blog
    siio
  • 전체
    오늘
    어제
    • category (47)
      • Projects (4)
      • Java (1)
      • Spring (0)
      • DevOps (0)
      • algorithm (42)
      • 회고 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BufferedReader
    ncp
    DP
    risingcamp
    jre
    git #github #협업프로세스
    Knapsack
    Cross Domain
    Scanner
    10971
    same site
    jvm
    외판원순회
    JDK
    dfs
    http only cookie
    SWYP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
siio
[BOJ] 2178. 미로탐색
상단으로

티스토리툴바