# 생각

영역 구하기 문제들 처럼 모든 점에서 전체 BFS를 돌려 해결할 수 있다

 

단, 비가 내리는 높이마다 안전영역을 계산해야 하기 때문에

비가 오지 않은 0부터 입력 받을때 max값인 maxHeight까지 BFS를 실행해준다

 

 

# 전체 코드

#include <bits/stdc++.h>
using namespace std;

int board[102][102];
int vis[102][102];
int dx[4] = { 1,-1,0,0 }, dy[4] = { 0,0,1,-1 };
int n;
queue<pair<int, int>> q;

void INIT()
{
	for (int i = 0; i < n; i++)
	{
		fill(vis[i], vis[i] + n, 0);
	}
}

void BFS(int i, int j, int height)
{
	vis[i][j] = 1;
	q.push({ i,j });
	while (!q.empty())
	{
		auto cur = q.front();	q.pop();
		for (int dir = 0; dir < 4; dir++)
		{
			int nx = cur.first + dx[dir], ny = cur.second + dy[dir];
			if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
			if (vis[nx][ny] == 0 && board[nx][ny] > height)	// 방문하지 않았으면서, 침수되지 않았을 때
			{
				vis[nx][ny] = 1;
				q.push({ nx,ny });
			}
		}
	}
	
}

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

	cin >> n;
	int maxHeight = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> board[i][j];
			maxHeight = max(board[i][j], maxHeight);	// 잠기는 최대 높이 저장
		}
	}
	// 0부터 최대높이까지 반복, 전체 BFS
	int maxCount = 0;
	for (int height = 0; height <= maxHeight; height++)
	{
		INIT();
		int count = 0;	// 0부터 최대높이까지 각각 최대 영역 개수 저장
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (vis[i][j] == 0 && board[i][j] > height)	// 방문 여부, 침수 여부
				{
					BFS(i,j,height);
					count++;
				}
			}
		}
		maxCount = max(count, maxCount);
	}
	cout << maxCount;
}

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

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

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

[BOJ] 1629_곱셈 with cpp  (0) 2022.01.25
[BOJ] 5427_불 with cpp  (0) 2022.01.25
[BOJ] 6593_상범 빌딩 with cpp  (0) 2022.01.23
[BOJ] 5014_스타트링크 with cpp  (0) 2022.01.20
[BOJ] 2667_단지번호붙이기 with cpp  (0) 2022.01.19

+ Recent posts