알고리즘 공부
백준 영역 구하기
컴퓨터과학
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;
}