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

백준 2583 c++ -[PlusUltraCode]

by PlusUltraCode 2024. 2. 23.

[필자 사고]

전형적인 2차원 배열 그래프 탐색문제이다

이 문제의 특이한 점은 좌표로 되어 있다는 것이다.

index로만 배열을 다뤄온지라 좌표를 보고 몇십분간 어떻게 해야 오류가 안날지 계쏙 생각하게 되었다.

간단하게 문제 해결방법을 말하겠다.

 

1. 문제에서 주어지는 빗금친 영역을 배열에 -1로 표시해줬다.

2. 나머지 빗금치지 않은 부분을 BFS탐색을 이용해 넓이를 Resultcount벡터에 넣어줬다.

 

[소스코드]

 

 

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

typedef struct Rect {
	int x1, y1, x2, y2;

}Rect;

int dy[4] = { 0,1,0,-1 };
int dx[4] = { 1,0,-1,0 };
int N, M, K;
vector<vector<int>> Arr;
vector<vector<bool>> visited;
vector<Rect> RectPoint;
vector<int> ResultCount;
bool Inside(int sero, int garo) {
	if (sero >= 0 && sero < N && garo >= 0 && garo < M)return true;
	return false;
}

void PaintArr() {
	for (int i = 0; i < RectPoint.size(); i++) {
		for (int sero = RectPoint[i].y1; sero < RectPoint[i].y2; sero++) {
			for (int garo = RectPoint[i].x1; garo < RectPoint[i].x2; garo++) {
				Arr[sero][garo] = -1;
			}
		}
	}
}

void Input() {
	cin >> N >> M >> K;
	Arr.resize(N);
	visited.resize(N);
	for (int i = 0; i < N; i++) {
		Arr[i].resize(M,1);
		visited[i].resize(M);
	}
	RectPoint.resize(K);

	
	for (int i = 0; i < K; i++) {
		int a, b, c, d;
		cin >> a >> b >> c >> d;
		RectPoint[i].x1 = a;
		RectPoint[i].y1 = b;
		RectPoint[i].x2 = c;
		RectPoint[i].y2 = d;
	}
	
	PaintArr();
	
}
void Print() {
	for (int i = 0; i < N; i++) {
		for (int k = 0; k < M; k++) {
			cout << Arr[i][k] << "  ";
		}
		cout << '\n';
	}
}
void BFS() {
	queue<pair<int, int>> myQueue;
	for (int i = 0; i < N; i++) {
		for (int k = 0; k < M; k++) {
			if (Arr[i][k] == 1&&visited[i][k]==false) {
			
				myQueue.push({ i,k });
				visited[i][k] = true;
				int area = 1;
				while (!myQueue.empty()) {
					int nowSero = myQueue.front().first;
					int nowGaro = myQueue.front().second;
					myQueue.pop();
					for (int adj = 0; adj < 4; adj++) {
						int nextSero = nowSero + dy[adj];
						int nextGaro = nowGaro + dx[adj];
						if (Inside(nextSero, nextGaro) &&
							Arr[nextSero][nextGaro] == 1 &&
							visited[nextSero][nextGaro] == false) {
							visited[nextSero][nextGaro] = true;
							myQueue.push({ nextSero,nextGaro });
							area++;
						}
					}
				}
				ResultCount.push_back(area);

			}
		}
	}
}

int main(void) {
	Input();
	BFS();
	cout << ResultCount.size()<<"\n";
	sort(ResultCount.begin(), ResultCount.end());
	for (int temp : ResultCount) {
		cout << temp << " ";
	}
}

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

백준 4963 c++ -[PlusUltraCode]  (0) 2024.02.26
백준 13549 c++ -[PlusUltraCode]  (1) 2024.02.26
백준 2468 c++ - [PlusUltraCode]  (0) 2024.02.23
14502 백준 c++ -[PlusUltraCode]  (0) 2024.02.23
백준 1865 c++ -[PlusUltraCode]  (0) 2024.02.22