본문 바로가기
🥇Baekjoon Solutions/그래프(BFS, DFS, 다익스트라, 플로이드 와샬)

[C++] 백준 2638번: 치즈

by 코푸는 개발자 2021. 8. 19.
728x90

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

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로

www.acmicpc.net

 

풀이

깊이 우선 탐색(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

댓글