Untitled
unknown
c_cpp
3 years ago
2.3 kB
12
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...