※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1888번 문제인 곰팡이이다.
문제는 아래 링크를 확인하자.

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

 

1888번: 곰팡이

첫 줄에 곰팡이가 피어 있는 벽의 크기를 나타내는 두 정수 m과 n이 주어진다. (1 ≤ m, n ≤100) 둘째 줄부터는 벽의 상황이 한 줄에 한 행씩 주어진다. 곰팡이가 피어있는 곳은 그 곰팡이의 자라는

www.acmicpc.net

어느 순간에 모든 곰팡이가 한 덩어리가 되는지를 구하는 문제이다.

 

매 초마다 (1) 현재 모든 곰팡이가 연결되어있는지를 bfs를 통해 확인하고 (2) 그렇지 않다면 1초 뒤의 곰팡이의 상태를 나타내는 판을 새로 만드는 것을 반복해 문제를 해결하자.

 

초기상태로부터 길어야 100일 이내에 곰팡이는 한 덩어리가 되고, 각 곰팡이에 대해 번져나갈 칸을 하나하나 조사하는 것은 많아야 1만개의 칸에서 주변 121개의 칸을 조사하는 것으로 가능하므로 무식한 구현으로도 2초의 제한시간 내에 충분히 통과할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <utility>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

int R, C, sR, sC;
char board[100][100];
char tmp[100][100];
int ans, cnt;
int visited[100][100];

int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };

queue<pair<int, int>> que;

int bfs() {
	int ret = 1;
	memset(visited, 0, sizeof(visited));

	que.push(make_pair(sR, sC));
	visited[sR][sC] = 1;
	while (!que.empty()) {
		int r = que.front().first, c = que.front().second; que.pop();
		for (int i = 0; i < 4; i++) {
			int rr = r + dr[i], cc = c + dc[i];
			if (rr < 0 || rr >= R || cc < 0 || cc >= C) continue;
			if (board[rr][cc] && !visited[rr][cc]) {
				visited[rr][cc] = 1;
				que.push(make_pair(rr, cc));
				ret++;
			}
		}
	}

	return ret;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> R >> C;
	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			cin >> board[r][c];
			if (board[r][c] > '0') {
				sR = r, sC = c;
				cnt++;
			}
			else board[r][c] = 0;
		}
	}

	if (!board[sR][sC]) {
		cout << 0;
		return 0;
	}

	while (bfs() < cnt) {
		ans++;
		for (int r = 0; r < R; r++) {
			for (int c = 0; c < C; c++) {
				if (board[r][c]) {
					int k = board[r][c] - '0';
					for (int rr = r - k; rr <= r + k; rr++) {
						for (int cc = c - k; cc <= c + k; cc++) {
							if (rr < 0 || rr >= R || cc < 0 || cc >= C) continue;
							tmp[rr][cc] = max(tmp[rr][cc], board[r][c]);
						}
					}
				}
			}
		}
		swap(board, tmp);

		cnt = 0;
		for (int r = 0; r < R; r++) {
			for (int c = 0; c < C; c++) {
				if (board[r][c]) cnt++;
			}
		}
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 16401 // C++] 과자 나눠주기  (0) 2024.02.02
[BOJ 10565 // C++] Salary Inequity  (1) 2024.02.01
[BOJ 1388 // C++] 바닥 장식  (1) 2024.01.30
[BOJ 11123 // C++] 양 한마리... 양 두마리...  (1) 2024.01.29
[BOJ 2790 // C++] F7  (0) 2024.01.28

+ Recent posts