코딩문제

[백준] 쉬운 최단거리

do_hyuk 2025. 2. 9. 18:29
728x90
반응형

https://www.acmicpc.net/problem/14940

 

이 문제는 정석적인 BFS 문제라고 볼 수 있다.

중요한 포인트는 BFS 시작점을 (0,0)으로 두지 말고 목표 좌표로 설정해야하는 것이다.

 

전체코드

import java.io.*;
import java.util.*;

public class Main {

    private static int N,M;
    private static boolean[][] visited;
    private static int[][] map, result;

    private static int[] dirX = {1,0,-1,0};
    private static int[] dirY = {0,1,0,-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());

        visited = new boolean[N][M];
        map = new int[N][M];
        result = new int[N][M];

        int x=0, y = 0;
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine()," ");
            for (int j = 0; j < M; j++) {
                visited[i][j] = false;
                map[i][j] = Integer.parseInt(st.nextToken());
                if(map[i][j] == 2){
                    x = i;
                    y = j;
                } else if(map[i][j] == 0){
                    visited[i][j] = true;
                }
            }
        }

        bfs(x,y);

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (!visited[i][j]) {
                    result[i][j] = -1;
                }
                System.out.print(result[i][j] + " ");
            }
            System.out.println();
        }
    }

    private static void bfs(int x, int y) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{x,y});
        visited[x][y] = true;

        while(!queue.isEmpty()){
            int[] temp = queue.poll();
            for (int i = 0; i < 4; i++) {
                int newX = temp[0] + dirX[i];
                int newY = temp[1] + dirY[i];
                if (newX >= 0 && newX < N && newY >= 0 && newY < M) {
                    if (!visited[newX][newY] && map[newX][newY] == 1) {
                        visited[newX][newY] = true;
                        result[newX][newY] = result[temp[0]][temp[1]] + 1;
                        queue.add(new int[]{newX,newY});
                    }
                }
            }
        }

    }
}
728x90
반응형