문제
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 |