문제

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

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

 

주안점

BFS로 보통은 치즈를 순회할 생각을 하지만 치즈가 없는 구간을 순회하며 체크 후 치즈 삭제

 

 

 

구조

BFS로 체크해가면서 순회하고 삭제하고 순회하고 삭제하고

 

 

코드
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>> v;
int visited[104][104], a[104][104];
int row,col,x,y,cnt,leave;

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

int main() {
    cin>>row>>col;
    for(int i=0; i<row; i++){
        for(int j=0; j<col; j++){
            cin>>a[i][j];
        }
    }
    queue<pair<int,int>> q;

    while(true){
        memset(visited,0,sizeof(visited));
        v.clear();
        visited[0][0] = 1;
        q.push({0,0});
        while(q.size()){
            tie(y,x) = q.front(); q.pop();
            for(int k=0; k<4; k++){
                int ny = y+dy[k];
                int nx = x+dx[k];
                if(ny>=row || nx>=col || ny<0 || nx<0) continue;
                if(visited[ny][nx]) continue;
                if(a[ny][nx] == 1) {
                    visited[ny][nx] = 1;
                    v.push_back({ny,nx});
                    continue;
                }
                visited[ny][nx] = 1;
                q.push({ny,nx});
            }
        }
        if(v.size() == 0) break;
        leave = v.size();
        for(pair<int,int> b : v)
            a[b.first][b.second] = 0;
        cnt++;
    }
    cout<<cnt<<"\n";
    cout<<leave<<"\n";
}

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

[백준] 14716번 : 현수막  (0) 2021.12.15
[백준] 2292번 : 벌집  (0) 2021.12.01
[백준] 회의실 배정  (0) 2021.11.04
[백준] 부녀회장이 될테야  (0) 2021.11.03
[백준] 14501번 : 퇴사  (0) 2021.10.27

+ Recent posts