#include <iostream>
#include <string>
#include <queue>
#include <algorithm>

using namespace std;
#define X first
#define Y second

int board[302][302]={0};
int vis[302][302];
int day[302][302];

int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int cnt=0;
    //입력
    int n,m;
    cin >> n >> m;
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            cin >> board[i][j];
        }
    }
    //초기화
    for(int i=0; i<n; i++)  fill(vis[i],vis[i]+m,-1);
    
    while(cnt<2) {
        cnt=0;
        for(int i=0; i<n; i++) {
            for(int j=0; j<m; j++) {
                //주변에 물이 얼마나 있는지 확인
                if(board[i][j]==0 || vis[i][j]==-1) continue;

                if(board[i][j]>0) {
                    vis[i][j]=0;
                    queue<pair<int,int>> q;
                    q.push({i,j});
                    while(!q.empty()) {
                        pair<int,int> cur=q.front(); q.pop();
                        for(int idx=0; idx<4; idx++) {
                            int nx=cur.X+dx[idx];
                            int ny=cur.Y+dy[idx];

                            if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
                            //주변이 물이면 현재 위치에 있는 물 +1
                            if(board[nx][ny]==0) vis[cur.X][cur.Y]+=1;
                        }
                    }
                }
                if(board[i][j]==0) continue;

                cnt++;
                queue<pair<int,int>> Q;
                Q.push({i,j});
                while(!Q.empty()) {
                     pair<int,int> cur=q.front(); q.pop();
                    for(int idx=0; idx<4; idx++) {
                        int nx=cur.X+dx[idx];
                        int ny=cur.Y+dy[idx];
                        if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
                        //빙산은 잇는데 안들림
                        if(board[nx][ny]>0 || day[nx][ny]==0) {
                            day[nx][ny]=day[cur.X][cur.Y]+1;
                            int x=board[nx][ny]-vis[nx][ny];
                            if(x<0) board[nx][ny]=0;
                            else board[nx][ny]=x;
                            Q.push({i,j});
                        }
                }
            }
        }
    }
}
피드뱍좀 해줘

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: