백준공부/java

[백준] 14940번 쉬운 최단 거리 (silver 1

gomduri43 2023. 6. 17. 22:19

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

class point{
    int x;
    int y;
    public point(int x, int y){
        this.x=x;
        this.y=y;
    }
}
public class Main{
    static int[] possibleX={0,0,1,-1};
    static int[] possibleY={1,-1,0,0};

    public static void main (String[] args)throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb=new StringBuilder();
        Queue<point> que= new ArrayDeque<>();
        StringTokenizer st=new StringTokenizer(br.readLine());
        int n=Integer.parseInt(st.nextToken());
        int m=Integer.parseInt(st.nextToken());

        boolean[][] visit=new boolean[n+1][m+1];
        int[][] map=new int[n+1][m+1];
        for(int i=1; i<=n; i++){
            st=new StringTokenizer(br.readLine());
            for(int j=1; j<=m; j++){
                map[i][j]=Integer.parseInt(st.nextToken());
                if(map[i][j]==2){
                    que.offer(new point(j,i));
                }
            }
        }

        map[que.peek().y][que.peek().x]=0;
        while(!que.isEmpty()){
            point a=que.poll();
            for(int i=0; i<4; i++){
                int x=a.x+possibleX[i];
                int y=a.y+possibleY[i];
                if(x<0 || y<0 || x>m || y>n || visit[y][x]==true || map[y][x]==0  ){
                    continue;
                }
                map[y][x]=map[a.y][a.x]+1;
                visit[y][x]=true;
                que.offer(new point(x,y));
            }
        }


        for(int i=1; i<=n; i++){
            for(int j=1; j<=m; j++){
                if(map[i][j]==1 && visit[i][j]==false ){
                    sb.append(-1+" ");
                }
                else {
                    sb.append(map[i][j] + " ");
                }
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }
}