Untitled

 avatar
unknown
c_cpp
2 years ago
2.3 kB
7
Indexable
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
using pii = pair<int, int>;
int n, m;
int arr[101][101];
bool vis[101][101];
bool cheese[101][101];

int diffx[4] = {0,0,1,-1};
int diffy[4] = {1,-1,0,0};

deque<pii> deq;
deque<pii> che;

int bfs1(){
    che.push_back({0,0});
    while(!che.empty()){
        pii cur = che.front(); che.pop_front();
        int y = cur.first;
        int x = cur.second;
        arr[y][x] = 0;
        vis[y][x] = true;
        for(int i = 0;i<4;i++){
            int ny = y + diffy[i];
            int nx = x + diffx[i];
            if(0>ny || n<=ny || 0>nx || m <= nx) continue;
            if(arr[ny][nx] && !vis[ny][nx]){ // cheese exist
                vis[ny][nx] = true;
                deq.push_back({ny,nx});
            }else{
                if(!vis[ny][nx]){
                    che.push_back({ny,nx});
                    vis[ny][nx]= true;
                }
            }
        }
    }
    return deq.size();
}

int T;
int bfs2(){

    while(!deq.empty()){
        for(int i = 0;i<deq.size();i++){
            pii cur = deq.front(); deq.pop_front();
            // pop
            int y = cur.first;
            int x = cur.second;
            int cnt = 0;
            for(int i = 0;i<4;i++){
                int ny = y + diffy[i];
                int nx = x + diffx[i];
                if(0>nx || n<= nx || 0>ny || n <= ny) continue;
                if(arr[ny][nx]==0){
                    cnt++;
                }
            }
            if(cnt>=2){
                che.push_back({y,x});
            }
        }
    }
    return che.size();
}

void Print(){
    for(int i = 0;i<n;i++){
        for(int j = 0;j<m;j++){
            cout << arr[i][j] << " ";
        }
        cout << '\n';
    }
    cout << '\n';
}

int main(void){
    cin >> n >> m;
    for(int i =0;i<n;i++){
        for(int j = 0;j<m;j++){
            cin >> arr[i][j];
        }
    }
    
    while(1) // 시작할 곳을 탐색 
    {
        bfs1();
        if(!deq.empty()){
            memset(vis,0,sizeof(vis));
            bfs2(); // 녹이기 
            T++;
        }
        else{
            break;
        }
        Print();
    }
    cout << T <<'\n';
    // for(int i = 0;i<deq.size();i++){
    //     cout << deq[i].first << " " << deq[i].second << '\n';
    // }
}
Editor is loading...