Mini

백준 7576 토마토 //bfs 레벨(깊이) 구별하는법 본문

Algorithm/boj

백준 7576 토마토 //bfs 레벨(깊이) 구별하는법

Mini_96 2022. 8. 23. 14:45

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

1. 입력받다가 토마토(1)들이 있으면 좌표를 큐에 넣기 => 초기 트리 생성됨.(level 0)

※ bfs 레벨 구별법

1.초기값 qSize저장

2.qSize만큼 탐색하기

ex) Q : 2,1 -> 이면

2회만큼 돌고

2,1은 팝되고

그 이후 level이 ++됨. 

int level=0;
		
while(!q.isEmpty())
{
    //이렇게 해야 레벨(깊이)별로 구별 가능!!!!
    int qSize=q.size();
    for(int i=0;i<qSize;i++)
    {
        int[] parent = q.poll();

        //인접영역 탐색
        play(parent[0],parent[1]);
        //print();
        //System.out.println("================");
    }

    level++;

3. level별로 탐색하면서

4. 부모하나를 꺼냄

5. 그 부모의 인접자식에 대해 play(맵을 1로 바꿈), 큐에 추가

6. 한 레벨이 끝났다 == 하루가 지났다. -> answer++

참고 : 초반부터 answer이 +1 됨(-) -> 정답에 -1 해주면 됨.

 

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_7576_유동훈 {

	static int N;
	static int M;
	static int[][] map;
	static Queue<int[]> q = new LinkedList<>();
	static int answer;
	
	static void print()
	{
		for(int i=0;i<N;++i)
		{
			//st=new StringTokenizer(br.readLine());
			for(int j=0;j<M;++j)
			{
				System.out.print(map[i][j]);
			}
			System.out.println();
		}
	}
	
	static void bfs()
	{
		//큐에 토마토(x,y) 저장
		
		//int[] parent=q.peek();
		int level=0;
		
		while(!q.isEmpty())
		{
			//이렇게 해야 레벨(깊이)별로 구별 가능!!!!
			int qSize=q.size();
			for(int i=0;i<qSize;i++)
			{
				int[] parent = q.poll();
				
				//인접영역 탐색
				play(parent[0],parent[1]);
				//print();
				//System.out.println("================");
			}

			level++;
			answer++;
			
		}
		
	}
	
	//상,하,좌,우 1로 만들기
	//상,하,좌,우 자식 추가
	static void play(int r, int c)
	{
		
		if(r-1>=0 && map[r-1][c]==0)
		{
			map[r-1][c]=1;
			q.add(new int[] {r-1,c});

		}
		if(r+1<N && map[r+1][c]==0)
		{
			map[r+1][c]=1;
			q.add(new int[] {r+1,c});

		}
		if(c-1>=0 && map[r][c-1]==0)
		{
			map[r][c-1]=1;
			q.add(new int[] {r,c-1});

		}
		if(c+1<M && map[r][c+1]==0)
		{
			map[r][c+1]=1;
			q.add(new int[] {r,c+1});

		}

		
	}
	
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st;
		st=new StringTokenizer(br.readLine());
		M=Integer.parseInt(st.nextToken());
		N=Integer.parseInt(st.nextToken());
		
		map=new int[N][M];
		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]==1) q.add(new int[] {i,j});
			}
		}
		
		bfs();
		//print();
		
		//맵에 0이 남아있음->불가능->-1
		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]==0)
				{
					System.out.println(-1);
					System.exit(0);
				}
			}
		}
		
		
		//System.out.println();
		System.out.println(answer-1);
		

	}


}

'Algorithm > boj' 카테고리의 다른 글

백준 10026 적록색약  (0) 2022.08.24
백준 3055 탈출  (0) 2022.08.24
백준 13023번 ABCDE  (0) 2022.08.23
백준 1697 숨바꼭질 //BFS 큐  (0) 2022.08.20
17375: 캐슬디펜스  (0) 2022.08.19