토마토7576

LJM·2023년 2월 10일
0

백준풀기

목록 보기
87/259

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

시작지점이 여러개일때 너비탐색하기
너비탐색이 몇단계까지 가는지 기록하기

외에는 어려운 부분은 없는 문제이다

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

class Pos
{
    int r;
    int c;

    public Pos() {}

    public Pos(int r, int c) {
        this.r = r;
        this.c = c;
    }
}

public class Main
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(" ");

        int M = Integer.parseInt(input[0]);//column
        int N = Integer.parseInt(input[1]);//row

        int[][] box = new int[N][M];//0 ,1
        int[][] visit = new int[N][M];
        for(int i = 0; i < N; ++i)
            Arrays.fill(visit[i], -1);

        Queue<Pos> que = new LinkedList<>();

        for(int i = 0; i < N; ++i)
        {
            input = br.readLine().split(" ");
            for(int j = 0; j < M; ++j)
            {
                if(Integer.parseInt(input[j]) == 1)
                {
                    box[i][j] = 1;
                    que.add(new Pos(i, j));
                    visit[i][j] = 0;
                }
                else if(Integer.parseInt(input[j]) == -1)
                {
                    box[i][j] = -1;
                }
            }
        }

        bfs(que, box, visit);
    }

    private static void bfs(Queue<Pos> que, int[][] box, int[][] visit)
    {
        int ans = 0;
        while(que.isEmpty() == false)
        {
            Pos cur = que.poll();

            Pos[] nP = new Pos[4];

            nP[0] = new Pos(cur.r-1, cur.c);
            nP[1] = new Pos(cur.r, cur.c+1);
            nP[2] = new Pos(cur.r+1, cur.c);
            nP[3] = new Pos(cur.r, cur.c-1);

            for(int i = 0; i < 4; ++i)
            {
                if(nP[i].r < 0 || nP[i].r >= box.length
                || nP[i].c < 0 || nP[i].c >= box[0].length)
                    continue;

                if(visit[nP[i].r][nP[i].c] != -1)
                    continue;

                if(box[nP[i].r][nP[i].c] != 0)
                    continue;

                que.add(nP[i]);
                visit[nP[i].r][nP[i].c] = visit[cur.r][cur.c]+1;
                box[nP[i].r][nP[i].c] = 1;
                ans = Math.max(ans, visit[nP[i].r][nP[i].c]);
            }
        }

        boolean noZero = true;
        for(int i = 0; i < box.length; ++i)
        {
            for(int j = 0; j < box[0].length; ++j)
            {
                if(box[i][j] == 0)
                {
                    noZero = false;
                    break;
                }

            }
        }

        if(noZero)
            System.out.println(ans);
        else
            System.out.println(-1);
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글