ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/JAVA] 14940번 쉬운 최단거리 - BFS(너비 우선 탐색)
    ETC/Algorithm 2023. 6. 9. 09:56

    풀이

    BFS 알고리즘

    최단거리 문제이므로 Queue를 사용하여 BFS를 구현하였다.

    시작점은 한 개

    start[2]를 통해 시작점 x, y좌표를 저장한다.
    BFS 시작할 때 출력 형태를 맞추기 위해 시작점을 0으로 지정하고, 미리 visited를 true로 설정해서 진행한다.

    출력하기 직전에 판단

    if(visited[i][j]) bw.write(map[i][j] + " ");
    else if (!visited[i][j] && map[i][j] == 1) bw.write("-1" + " ");
    else bw.write("0" + " ");

    조건이 3개가 존재한다.
    방문했을 경우 그대로 출력한다.
    방문하지 않았는데 갈 수 있었던 길이면 -1로
    그 외에는 원래 못가는 길이였으므로 0으로 출력한다.

    코드

    제출 코드

    import java.io.*;
    import java.util.*;
    
    class Main {
    
        static int[][] map;
        static boolean[][] visited;
        static int N, M;
        static Queue<Pos> q = new LinkedList<>();
    
        static class Pos {
            int x;
            int y;
            Pos(int x, int y) {
                this.x = x;
                this.y = y;
            }
        }
    
        static int[] opsX = {1, -1, 0, 0};
        static int[] opsY = {0, 0, 1, -1};
        static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        static StringTokenizer st;
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            st = new StringTokenizer(br.readLine(), " ");
    
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());
    
            map = new int[N][M];
            visited = new boolean[N][M];
    
            int[] start = new int[2];
    
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                for (int j = 0; j < M; j++) {
                    map[i][j] = Integer.parseInt(st.nextToken());
                    if (map[i][j] == 2) {
                        start[0] = i;
                        start[1] = j;
                    }
                }
            }
            bfs(start[0], start[1]);
            printMap();
        }
    
        static void bfs(int i, int j) {
            q.offer(new Pos(i, j));
            visited[i][j] = true;
            map[i][j] = 0;
            while (!q.isEmpty()) {
                Pos node = q.poll();
    
                for (int k = 0; k < 4; k++) {
                    int nX = node.x - opsX[k];
                    int nY = node.y - opsY[k];
    
                    if (checkRange(nX, nY)) {
                        if (map[nX][nY] == 1 && !visited[nX][nY]) {
                            q.offer(new Pos(nX, nY));
                            visited[nX][nY] = true;
                            map[nX][nY] = map[node.x][node.y] + 1;
                        }
                    }
                }
            }
        }
    
        static boolean checkRange(int x, int y) {
            return -1 < x && x < N && -1 < y && y < M;
        }
    
        static void printMap() throws IOException {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if(visited[i][j]) bw.write(map[i][j] + " ");
                    else if (!visited[i][j] && map[i][j] == 1) bw.write("-1" + " ");
                    else bw.write("0" + " ");
                }
                bw.write("\n");
            }
            bw.flush();
        }
    }

    댓글

Designed by black7375.