[백준] 2468. 안전 영역

고재욱·2021년 10월 11일

Baekjoon

목록 보기
33/35

❓ 문제 ❓
[안전 영역](https://www.acmicpc.net/problem/2468}

💯 문제 풀이 💯
입력으로 땅의 최대, 최소 높이를 확인하고 그 높이 기준으로 BFS를
진행시켜 땅의 개수를 파악한다.

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int dirx[4] = { 1,0,-1,0 };
int diry[4] = { 0,1,0,-1 };
int n, max_height = -1, min_height = 101, answer = 0;
int map[101][101];
bool visit[101][101];
void clear_map() {
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			visit[i][j] = false;
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) 
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
			min_height = min(min_height, map[i][j]);
			max_height = max(max_height, map[i][j]);
		}

	for (int i = min_height-1; i <= max_height; i++) {
		int cnt = 0;
		for (int j = 0; j < n; j++) {
			for (int k = 0; k < n; k++) {
				if (!visit[j][k] && map[j][k] > i) {
					cnt++;
					visit[j][k] = true;
					queue<pair<int, int>> q;
					q.push({ j,k });
					while (!q.empty()) {
						int y = q.front().first;
						int x = q.front().second;
						q.pop();
						for (int a = 0; a < 4; a++) {
							int movey = y + diry[a], movex = x + dirx[a];
							if (movey >= 0 && movex >= 0 && movey < n && movex < n && map[movey][movex] > i && !visit[movey][movex]) {
								visit[movey][movex] = true;
								q.push({ movey, movex });
							}
						}
					}
				}
			}
		}
		answer = max(answer, cnt);
		clear_map();
	}
	cout << answer;
}

0개의 댓글