ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 백준 2178 미로 탐색
    Programming/Algorithm 2021. 2. 25. 20:13

     

    문제

    (1,1)에서 (N,M)으로 이동하는 최단경로를 구하는 문제이다.

     

     

    풀이

    BFS로 map을 탐색하며 이동거리로 map을 초기화 했다.

    map[n][m]이 1이 아니게 되면 가장 먼저 도착지점에 다다른 것이므로 break하고 이동거리를 출력하도록 했다. 

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class Main {
        static int N, M;
        static int[][] map;
        static int AVAILABLE = 1;
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());
            map = new int[N][M];
    
            for (int i = 0; i < N; i++) {
                String s = br.readLine();
                for (int j = 0; j < M; j++) {
                    map[i][j] = s.charAt(j) - '0';
                }
            }
    
            System.out.println(BFS());
        }
    
        static int BFS() {
            int[] dx = {-1, 1, 0, 0};
            int[] dy = {0, 0, -1, 1};
    
            Queue<int[]> queue = new LinkedList<>();
            queue.add(new int[]{0, 0});
            map[0][0] = 2;
    
            while (!queue.isEmpty()) {
                int[] point = queue.poll();
                for (int i = 0; i < 4; i++) {
                    int nx = point[0] + dx[i];
                    int ny = point[1] + dy[i];
                    if (isRange(nx, ny) && map[nx][ny] == AVAILABLE) {
                        queue.add(new int[]{nx, ny});
                        map[nx][ny] = map[point[0]][point[1]] + 1;
                    }
                }
                if (map[N - 1][M - 1] != AVAILABLE)
                    break;
            }
    
            return map[N - 1][M - 1] - 1;
        }
    
        static boolean isRange(int x, int y) {
            if (x < 0 || x >= N || y < 0 || y >= M)
                return false;
            return true;
        }
    }
    

     

     

    채점결과

    댓글

Designed by black7375.