본문 바로가기
알고리즘/백준

백준 2636 치즈 C++

by ash9river 2025. 1. 9.

간단한 해설

외각부터 벽이 있어서 그냥 단순하게 bfs를 반복하면 된다.

 

c가 된 부분의 값을 큐를 순회하면서 0으로 만드는 방법으로 해결

 

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
using namespace std;
int dy[4]={1,-1,0,0};
int dx[4]={0,0,1,-1};
int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	int n,m;
    cin>>n>>m;
    vector<vector<int>> v(n,vector<int>(m));
    for(int i=0;i<n;++i){
        for(int j=0;j<m;++j){
            cin>>v[i][j];
        }
    }
    int time=0,cheeze=0;
    while(true){
        bool state=false;
        int tmpCheeze=0;
        for(int i=0;i<n;++i){
            for(int j=0;j<m;++j){
                if(v[i][j]==1){
                    state=true;
                    ++tmpCheeze;
                }
            }
        }
        if(!state) break;
        else cheeze=tmpCheeze;
        ++time;
        vector<vector<bool>> visited(n,vector<bool>(m,false));
        visited[0][0]=true;
        queue<pair<int,int>> q;
        q.push({0,0});
        while(!q.empty()){
            int crnY=q.front().first;
            int crnX=q.front().second;
            q.pop();
            for(int i=0;i<4;++i){
                int ny=dy[i]+crnY;
                int nx=dx[i]+crnX;
                if(ny<0||ny>=n||nx<0||nx>=m) continue;
                if(visited[ny][nx]) continue;
                visited[ny][nx]=true;
                if(v[ny][nx]==1){
                    v[ny][nx]=0;
                }
                else q.push({ny,nx});
            }
        }
    }
    cout<<time<<'\n'<<cheeze;
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 28449 누가 이길까 C++  (0) 2025.02.08
백준 1911 흙길 보수하기 C++  (0) 2025.01.15
백준 2141 우체국 C++  (0) 2025.01.09
백준 1456 거의 소수 C++  (0) 2025.01.08
백준 17835 면접보는 승법이네 C++  (0) 2024.12.18