Notice
Recent Posts
Recent Comments
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 2573 빙산 본문

Programming/BOJ

[백준/BOJ] 2573 빙산

he1fire 2021. 1. 8. 15:45
728x90

문제 : 2573 빙산

 

2573번: 빙산

첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을

www.acmicpc.net

빙산의 위치와 높이가 주어질 때,

2개 이상으로 나누어지는 시간을 구해 출력하는 문제이다.

매해 빙산이 녹는 높이를 카운트해서 줄여주면서

BFS를 통해 빙산의 개수를 구해 0이나 2 이상이 되는 순간을 출력하면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef pair<ll,ll> pll;
ll N, M, ans, arr[305][305], cnt[305][305], visited[305][305];
ll dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
queue<pll> q;
void melt(){
    fill(&cnt[0][0],&cnt[304][305],0);
    for (int i=0;i<N;i++){
        for (int j=0;j<M;j++){
            for (int k=0;k<4;k++){
                ll dx=i+dir[k][0], dy=j+dir[k][1];
                if (dx<0 || dx>=N || dy<0 || dy>=M)
                    continue;
                if (arr[dx][dy]==0)
                    cnt[i][j]++;
            }
        }
    }
    for (int i=0;i<N;i++){
        for (int j=0;j<M;j++){
            arr[i][j]-=cnt[i][j];
            if (arr[i][j]<0)
                arr[i][j]=0;
        }
    }
}
ll BFS(){
    ll ret=0;
    fill(&visited[0][0],&visited[304][305],0);
    for (int i=0;i<N;i++){
        for (int j=0;j<M;j++){
            if (arr[i][j]!=0 && visited[i][j]==0){
                ret++;
                visited[i][j]=1;
                q.push({i,j});
                while (!q.empty()){
                    ll x=q.front().first, y=q.front().second;
                    q.pop();
                    for (int k=0;k<4;k++){
                        ll dx=x+dir[k][0], dy=y+dir[k][1];
                        if (dx<0 || dx>=N || dy<0 || dy>=M)
                            continue;
                        if (arr[dx][dy]!=0 && visited[dx][dy]==0){
                            visited[dx][dy]=1;
                            q.push({dx,dy});
                        }
                    }
                }
            }
        }
    }
    return ret;
}
int main(){
    cin >> N >> M;
    for (int i=0;i<N;i++){
        for (int j=0;j<M;j++){
            cin >> arr[i][j];
        }
    }
    while (1){
        if (BFS()!=1){
            cout << (BFS()==0 ? 0 : ans);
            break;
        }
        melt();
        ans++;
    }
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 20041 Escaping  (0) 2021.09.18
[백준/BOJ] 3321 가장 큰 직사각형  (0) 2021.09.18
[백준/BOJ] 1916 최소비용 구하기  (0) 2020.12.04
[백준/BOJ] 9375 패션왕 신혜빈  (0) 2020.12.01
[백준/BOJ] 1080 행렬  (0) 2020.11.29
Comments