본문 바로가기

Algorithm/BAEKJOON

[BOJ] 2573번 빙산 (C++)

728x90
반응형

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

 

2573번: 빙산

첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을

www.acmicpc.net

 

#include <iostream>
#include <queue>
using namespace std;

int arr[300][300];
int tmp[300][300];
bool visited[300][300];
int n, m;

int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};

void init(){
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			visited[i][j] = false;
		}
	}	
}

void melt(int a, int b){
	int c = 0;
	if(a - 1 >= 0 && arr[a - 1][b] == 0) c++;
	if(a + 1 < n && arr[a + 1][b] == 0) c++;
	if(b - 1 >= 0 && arr[a][b - 1] == 0) c++;
	if(b + 1 < m && arr[a][b + 1] == 0) c++;
	tmp[a][b] = arr[a][b] - c;
	if(tmp[a][b] < 0) tmp[a][b] = 0;
}

void bfs(int a, int b){
	queue<pair<int, int>> q;
	q.push({a, b});
	visited[a][b] = true;
	
	while(!q.empty()){
		int cx = q.front().first;
		int cy = q.front().second;
		q.pop();
		
		for(int i = 0; i < 4; i++){
			int nx = cx + dx[i];
			int ny = cy + dy[i];
			
			if(!(nx >= 0 && ny >= 0 && nx < n && ny < m)) continue;
			
			if(arr[nx][ny] != 0 && !visited[nx][ny]){
				visited[nx][ny] = true;
				q.push({nx, ny});
			}
		}
	}
}

int main() {
	cin >> n >> m;
	
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			cin >> arr[i][j];
		}
	}
	int year = 0;
	while(true){
		init();
		
		int cnt = 0;
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				if(arr[i][j] != 0 && !visited[i][j]) {
					bfs(i, j);
					cnt++;
				}
			}
		}
		if(cnt >= 2) break;
		if(cnt == 0){
			year = 0;
			break;
		}

		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				if(arr[i][j] == 0) tmp[i][j] = 0;
				else melt(i, j);
			}
		}
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				arr[i][j] = tmp[i][j];
			}
		}
		
		year++;
	}
	cout << year << endl;
	return 0;
}
728x90
반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[BOJ] 2109번 순회강연 (C++)  (0) 2022.08.21
[BOJ] 1874번 스택 수열 (C++)  (0) 2022.08.18
[BOJ] 13904번 과제 (C++)  (0) 2022.08.16
[BOJ] 2665번 미로 만들기 (C++)  (0) 2022.08.15
[BOJ] 16927번 배열 돌리기 2 (C++)  (0) 2022.08.12