BFS
현재 맵의 빙산의 개수가 0이 될 때까지 반복문을 수행한다.
물과 접촉한 빙산의 높이를 줄여주는 BFS를 수행한다.
높이가 달라진 빙산들은 임시 맵과 큐에 따로 저장한다.
임시 맵의 정보를 기존 맵으로 복사한다.
임시 큐의 빙산 정보를 기존 큐의 빙산정보로 옮김과 동시에
높이가 달라진 빙산들이 서로 떨어졌는지 확인하는 BFS를 수행한다.
중간에 서로 떨어진 경우에는 현재 year를 출력하고 return 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#define fasti ios_base::sync_with_stdio(false); cin.tie(0);
#define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 1e9+7
#define pii pair<int, int>
typedef long long ll;
// typedef pair<int, int> pii;
using namespace std;
int N, M;
int Map[301][301];
int Tmap[301][301];
int dr[4] = {0, 0, 1, -1};
int dc[4] = {1, -1, 0, 0};
queue<pii > iceque, icetemp;
int year = 0;
bool visited[301][301];
void input(){
cin >> N >> M;
for(int r = 0; r < N; r++){
for(int c = 0; c < M; c++){
cin >> Map[r][c];
Tmap[r][c] = Map[r][c];
if(Map[r][c]) iceque.push({r, c});
}
}
}
void BFS(){
while(!iceque.empty()){
pii now = iceque.front();
iceque.pop();
for(int k = 0; k < 4; k++){
int nr = now.first + dr[k];
int nc = now.second + dc[k];
if(nr < 0 || nr >= N || nc < 0 || nc >= M) continue;
if(!Map[nr][nc]){
Tmap[now.first][now.second]--;
}
}
if(Tmap[now.first][now.second] > 0){
icetemp.push({now});
}
else Tmap[now.first][now.second] = 0;
}
}
void show(){
for(int r = 0; r < N; r++){
for(int c = 0; c < M; c++){
Map[r][c] = Tmap[r][c];
}
}
}
void check(int r, int c){
queue<pii > que;
que.push({r, c});
while(!que.empty()){
pii now = que.front();
que.pop();
for(int k = 0; k < 4; k++){
int nr = now.first + dr[k];
int nc = now.second + dc[k];
if(nr < 0 || nr >= N || nc < 0 || nc >= M || !Map[nr][nc] || visited[nr][nc]) continue;
visited[nr][nc] = true;
que.push({nr, nc});
}
}
}
void solve(){
while(!iceque.empty()){
year++;
BFS();
show();
memset(visited, 0, sizeof(visited));
int ct = 0;
while(!icetemp.empty()){
int r = icetemp.front().first;
int c = icetemp.front().second;
iceque.push(icetemp.front());
if(!visited[r][c]){
check(r, c);
ct++;
}
if(ct > 1){
cout << year;
return;
}
icetemp.pop();
}
}
cout << 0;
}
int main(){
fastio
input();
solve();
return 0;
}
|
cs |
'Algorithm > BOJ' 카테고리의 다른 글
[백준 16681] 등산 C++ (0) | 2021.07.21 |
---|---|
[백준 1890] 점프 C++ (0) | 2021.07.21 |
[백준 3977] 축구 전술 C++ (0) | 2021.07.21 |
[백준 1504] 특정한 최단경로 C++ (0) | 2021.07.16 |
[백준 2213] 트리의 독립집합 C++ (2) | 2021.07.15 |