728x90
https://www.acmicpc.net/problem/2638
풀이
깊이 우선 탐색(DFS) 그래프 탐색 방식과 너비 우선 탐색(BFS) 방식을 모두 사용하여 문제 풀이를 진행 하였습니다.
#include <iostream>
#include <queue>
using namespace std;
queue<pair<int, int>>q, p;//q:치즈 위치 저장, p:이번 턴에 녹을 치즈들
int N, M;
int page[101][101];
//탐색 방향 위, 아래, 왼쪽, 오른쪽
int idx[4] = { 0,0,-1,1 };
int idy[4] = { -1,1,0,0 };
void dfs_air(int n ,int m) {
if (page[n][m] != 0)return;
page[n][m] = 2;
for (int i = 0; i < 4; i++) {
int x = m + idx[i];
int y = n + idy[i];
if (x >= 0 && x < M && 0 <= y && y < N && page[y][x] == 0)
dfs_air(y, x);
}
}
void melt() {
int count = q.size();
for (int i = 0; i < count; i++) {
int n = q.front().first;
int m = q.front().second;
q.pop();
int count_edge = 0;
for (int j = 0; j < 4; j++) {
int x = m + idx[j];
int y = n + idy[j];
if (page[y][x] == 2)
count_edge++;
}
if (count_edge >= 2) {
p.push(make_pair(n, m));
}
else
q.push(make_pair(n, m));//이번 턴에 녹지 않는 치즈들
}
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> page[i][j];
if (page[i][j] == 1)
q.push(make_pair(i, j));
}
}
int answer = 0;
dfs_air(0, 0);
while (q.size() != 0) {
melt();
while (!p.empty()) {
int y = p.front().first;
int x = p.front().second;
p.pop();
page[y][x] = 0;
dfs_air(y, x);
}
answer++;
}
cout << answer;
return 0;
}
728x90
'🥇Baekjoon Solutions > 그래프(BFS, DFS, 다익스트라, 플로이드 와샬)' 카테고리의 다른 글
[C++] 플로이드 와샬(Floyd Warshall) 알고리즘 개념 (0) | 2021.08.24 |
---|---|
[C++] 백준 13549번: 숨바꼭질 3 (0) | 2021.08.23 |
[C++] 백준 11779번: 최소비용 구하기 2 (0) | 2021.08.23 |
[C++] 다익스트라(Dijkstra) 알고리즘 개념 (0) | 2021.08.23 |
[C++] DFS(Depth First Search), BFS(Breath First Search) 개념 (0) | 2021.08.23 |
댓글