알고리즘 공부

백준 영역 구하기

컴퓨터과학 2023. 7. 15. 18:11

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

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

음 조금 사각형 영역을 구하는게 까다롭네요 

그건말곤 쉽네요 

#include <iostream>
#include <vector>
#include <algorithm>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<bitset>
#include<cmath>
using namespace std;

void Prints(vector<vector<char>>maps, int r, int c) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			cout << maps[i][j] << ",";
		}
		cout << endl;
	}
	cout << endl;
}
void Prints(vector<vector<bool>>maps, int r, int c) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			cout << maps[i][j] << ",";
		}
		cout << endl;
	}
	cout << endl;
}
void Prints(vector<vector<int>>maps, int r, int c) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			cout << maps[i][j] << ",";
		}
		cout << endl;
	}
	cout << endl;
}
struct Point {
	int i;
	int j;
	int cnt;
};
struct Data {
	int index;
	int cnt = 0;
	int gc = 1;

};

int main() {
	//M 
	//N
	//K 직사각형
	int M, N, K;
	cin >> M >> N >> K;
	vector<vector<int>>maps;
	vector<bool>tmpVisited(N, false);
	vector<vector<bool>>bVisited(M,tmpVisited);

	for (int i = 0; i < M; i++) {
		vector<int>tmpMap;
		for (int j = 0; j < N; j++) {
			int tmp=0;
			
			tmpMap.push_back(tmp);
		}
		maps.push_back(tmpMap);
	}
	//0,2 4,4
	

	
	for (int z = 0; z < K; z++) {

	
	int squerStartx;
	int squerStarty;


	int squerEndx;
	int squerEndy;
		cin >> squerStartx >> squerStarty>> squerEndx>> squerEndy;
	//5 -1 
		for (int i = (M-1)- squerStarty; i >= M - squerEndy  ; i--) {
			for (int j = squerStartx; j < squerEndx; j++) {
				maps[i][j] = 1;
				bVisited[i][j] = true;
			}
		}
	}

	int diri[] = { 1,-1,0,0 };
	int dirj[] = { 0,0,1,-1 };
	int gCount = 0;
	vector<int>vCount;
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
			
			if (maps[i][j] == 0&&bVisited[i][j]==false) {
				int gPoint = 1;
				gCount++;
				queue<Point> q;
				Point p;
				p.i = i;
				p.j = j;
				p.cnt = 1;
				q.push(p);
				bVisited[i][j] = true;
				
				while (!q.empty()) {
					Point start=q.front();
					q.pop();
					for (int z = 0; z < 4; z++) {
						int tmpI = start.i + diri[z];
						int tmpJ = start.j + dirj[z];
						if (tmpI==-1|| tmpJ==-1||tmpI>=M||tmpJ>=N){
							continue;
						}
						if (maps[tmpI][tmpJ] == 0 && bVisited[tmpI][tmpJ] == false) {
							bVisited[tmpI][tmpJ] = true;
							Point tmpP;
							tmpP.i = tmpI;
							tmpP.j = tmpJ;
							tmpP.cnt = start.cnt + 1;
							gPoint++;
							q.push(tmpP);

						}
					}
					
				}
				if (gCount != 0) {
					vCount.push_back(gPoint);
				}
				
			}

		}
	}
	cout << gCount<<endl;
	if (vCount.size()>0) {
		sort(vCount.begin(), vCount.end());
	}
	
	for (int i = 0; i < vCount.size(); i++) {
		cout << vCount[i]<<" ";
	}
	return 0;
}