관리 메뉴

기억을 위한 기록들

[백준 2468: 안전 영역] - C++ 본문

Coding Test - cpp/BFS

[백준 2468: 안전 영역] - C++

에드윈H 2021. 1. 18. 21:30

www.acmicpc.net/problem/2468

 

2468번: 안전 영역

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

www.acmicpc.net

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
using namespace std;
int map[100][100];
int visited[100][100];
int cnt = 0;


int dir[4][2] =
{
	{0,-1},
	{1,0},
	{0,1},
	{-1,0}
};

int main() {
	int n;
	cin >> n;

	int high = 1;
	int input;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> input;
			map[i][j] = input;

			if (high < input)
				high = input;
		}
	}

	int result = 0;

	for (int find = 0; find < high; find++)
	{

		queue<pair<int, int>> Q;
		cnt = 0;
		memset(visited, 0, sizeof(visited));
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (map[i][j] <= find || visited[i][j] == 1)
					continue;

				Q.push({ i,j });
				visited[i][j] = true;
				while (!Q.empty())
				{
					int CurX = Q.front().first;
					int CurY = Q.front().second;
					Q.pop();
					for (int index = 0; index < 4; index++)
					{
						int nextX = CurX + dir[index][0];
						int nextY = CurY + dir[index][1];

						if (nextX < 0 || nextY < 0 || n <= nextX || n <= nextY)
							continue;

						if (map[nextX][nextY] > find && visited[nextX][nextY] == 0)
						{
							visited[nextX][nextY] = 1;
							Q.push({ nextX,nextY });

						}
					}
				}

				cnt++;
			}
		}

		if (result <= cnt)
			result = cnt;
	}
	cout << result << endl;
	return 0;
}