ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2178. 미로 탐색
    PS/Java 2022. 4. 1.

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

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

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

     

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


    입력

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

    출력

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


    예제 입력 1

    4 6
    101111
    101010
    101011
    111011

    예제 출력 1

    15

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class Main {
        static int N;
        static int M;
        static int[][] arr;
        static boolean[][] visited;
        static int min;
        public static void main(String[] args) throws Exception{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
    
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());
    
            arr = new int[N][M];
            visited = new boolean[N][M];
    
            for(int i = 0; i < N; i++) {
                String str = br.readLine();
                for(int j = 0; j < M; j++) {
                    arr[i][j] = str.charAt(j) - '0';
                }
            }
            min = Integer.MAX_VALUE;
            visited[0][0] = true;
    
            bfs();
            System.out.println(min);
        }
    
        public static int[] dr = {-1, 1, 0, 0};
        public static int[] dc = {0, 0 ,-1, 1};
        public static class Direction {
            int r;
            int c;
            int count;
            public Direction(int r, int c, int count) {
                this.r = r;
                this.c = c;
                this.count = count;
            }
        }
        public static void bfs() {
            Queue<Direction> queue = new LinkedList<>();
            queue.add(new Direction(0, 0, 1));
            visited[0][0] = true;
            while (!queue.isEmpty()) {
                Direction direction = queue.poll();
                if(direction.r == N - 1 && direction.c == M - 1) {
                    if(direction.count < min) {
                        min = direction.count;
                    }
                }
    
                for(int i = 0; i < 4; i++) {
                    int nr = direction.r + dr[i];
                    int nc = direction.c + dc[i];
                    if(nr >= 0 && nc >= 0 && nr < N && nc < M && !visited[nr][nc] && arr[nr][nc] == 1) {
                        visited[nr][nc] = true;
                        queue.add(new Direction(nr, nc, direction.count + 1));
                    }
                }
            }
        }
    }

    bfs 기초이다. visited배열을 이용해 방문했던부분은 다시 가지 않고 Direction 클래스를 만들어 좌표, 이동한 거리를 같이 가지고 다닌다.

    'PS > Java' 카테고리의 다른 글

    [백준] 1309. 동물원  (0) 2022.04.01
    [백준] 11650. 좌표 정렬하기  (0) 2022.04.01
    [백준] 2947. 나무 조각  (0) 2022.04.01
    [백준] 2578. 빙고  (0) 2022.04.01
    [백준] 7785. 회사에 있는 사람  (0) 2022.04.01

    댓글

Designed by Tistory.