알고리즘 공부/문제 풀이

[JAVA] 백준 2638 치즈

valid_ming 2021. 10. 7. 22:05

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

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로

www.acmicpc.net

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

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        map = new int[N][M];
        int cnt = 0;

        for(int i=0;i<N;i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<M;j++){
                int val = Integer.parseInt(st.nextToken());
                map[i][j] = val;
                if(val==1) cnt++;
            }
        }

        if(cnt==0){
            System.out.println(0);
            System.exit(0);
        }

        int time = 0;

        while(true){
            boolean melt = false;
            visit = new boolean[N][M];
            time++;

            dfs(0, 0);

            for(int i=0;i<N;i++){
                for(int j=0;j<M;j++){
                    if(map[i][j]>=3){
                        melt = true;
                        map[i][j] = 0;
                    }
                    if(map[i][j]==2) map[i][j] = 1;
                }
            }

            if(!melt) break;
        }

        System.out.println(time-1);

    }

    static int N, M;
    static int[][] map, d={{-1, 1, 0, 0}, {0, 0, -1, 1}};
    static boolean[][] visit;

    public static void dfs(int r, int c){
        visit[r][c] = true;

        for(int i=0;i<4;i++){
            int nr = r + d[0][i];
            int nc = c + d[1][i];

            if(0<=nr && nr<N && 0<=nc && nc<M){
                if(map[nr][nc]>0) map[nr][nc] ++;
                if(!visit[nr][nc] && map[nr][nc]==0) dfs(nr, nc);
            }
        }
    }
}