본문 바로가기
백준/그래프

백준 2468 c++ - [PlusUltraCode]

by PlusUltraCode 2024. 2. 23.

[필자 사고]

이 문제는 전형적인 2차원 배열 탐색문제이다

 

특이한 점은 물에 잠겨있는 안정 지역의 최댓값을 구해야 한다.

 

좀 더 효율적인 방법이 있나 생각을 해봤지만 떠오르지 않았고 

 

입력되는 N의 최댓값이 100이므로 시간복잡도 측면에서 문제가 되지 않아 

 

전체 경우의 수를 다 고려해주기로 했다.

 

물의 높이를 0부터 최대까지 다 고려해 BFS알고리즘을 수행했다.

 

 

[소스 코드]

 

 

 

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

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

vector<vector<int>> Arr;
vector<vector<bool>> visited;
int N;
int maxNum = -1;
int ResultCnt = -1;
bool Inside(int sero, int garo) {
	if (sero >= 0 && sero < N && garo >= 0 && garo < N)return true;
	return false;
}

void BFS(int Water) {
	vector<vector<int>> Temp;
	Temp = Arr;
	for (int i = 0; i < N; i++) {
		for (int k = 0; k < N; k++) {
			if (Temp[i][k] <= Water) {
				Temp[i][k] = -1;
			}
		}
	}
	queue<pair<int, int>>myQueue;
	int cnt = 0;
	for (int i = 0; i < N; i++) {
		for (int k = 0; k < N; k++) {
			if (Temp[i][k] != -1&&visited[i][k]==false) {
				cnt++;
				myQueue.push({ i,k });
				visited[i][k] = true;
				while (!myQueue.empty()) {
					int nowSero = myQueue.front().first;
					int nowGaro = myQueue.front().second;
					myQueue.pop();
					for (int i = 0; i < 4; i++) {
						int nextSero = nowSero + dy[i];
						int nextGaro = nowGaro + dx[i];
						if (Inside(nextSero, nextGaro) &&
							Temp[nextSero][nextGaro] != -1 &&
							visited[nextSero][nextGaro] == false) {
							visited[nextSero][nextGaro] = true;
							myQueue.push({ nextSero,nextGaro });
						}
					}
				}
			}
		}
	}
	visited.clear();
	visited.resize(N);
	for (int i = 0; i < N; i++) {
		visited[i].resize(N);
	}
	if (ResultCnt < cnt) {
		ResultCnt = cnt;
		return;
	}
	
}

void Input() {
	cin >> N;
	Arr.resize(N);
	visited.resize(N);
	for (int i = 0; i < N; i++) {
		Arr[i].resize(N);
		visited[i].resize(N);
	}
	for (int i = 0; i < N; i++) {
		for (int k = 0; k < N; k++) {
			cin >> Arr[i][k];
			if (maxNum < Arr[i][k])maxNum = Arr[i][k];
		}
	}

}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	Input();
	for (int i = 0; i <= maxNum; i++) {
		BFS(i);
	}
	cout << ResultCnt;
}

 

 

'백준 > 그래프' 카테고리의 다른 글

백준 13549 c++ -[PlusUltraCode]  (1) 2024.02.26
백준 2583 c++ -[PlusUltraCode]  (0) 2024.02.23
14502 백준 c++ -[PlusUltraCode]  (0) 2024.02.23
백준 1865 c++ -[PlusUltraCode]  (0) 2024.02.22
백준 1238 c++ - [PlusUltraCode]  (0) 2024.02.20