[백준] 2583 C++

2968 단어 baekjoonbaekjoon

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

#define MAX 100

// 영역 구하기
// bfs

int N, M, K;
int map[MAX][MAX];
bool visited[MAX][MAX] = {false, };
int area = 1; // 영역의 넓이
vector<int> num;

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

void bfs(int y, int x) {
  queue<pair<int, int>> q;
  q.push(make_pair(y, x));

  visited[y][x] = true;

  while(!q.empty()) {
    y = q.front().first;
    x = q.front().second;
    q.pop();

    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i];
      int ny = y + dy[i];

      if(0 <= nx && nx < N && 0 <= ny && ny < M) {
        if(map[ny][nx] == 0 && visited[ny][nx] == false) {
          // map 범위 안에 존재하며 빈 칸이고 방문하지 않았다면
          visited[ny][nx] = true;
          q.push(make_pair(ny, nx));
          area++;
        }
      }
    }
  }
}

int main() {
  ios::sync_with_stdio(0);

  cin >> M >> N >> K;

  int x=0, y=0, x2=0, y2=0;

  for(int i=0; i<K; i++) {  // map 채우기
    cin >> x >> y >> x2 >> y2;
    for(int q=y2-1; q>=y; q--) {
      for(int j=x2-1; j>=x; j--) {
        map[q][j] = 1; // 직사각형 영역을 1로 표시
      }
    }
  }

  // map 확인용 출력
  // cout << "map test" << '\n';
  // for(int i=0; i<M; i++) {
  //   for(int j=0; j<N; j++) {
  //     cout << map[i][j] << ' ';
  //   } cout << '\n';
  // }

  for(int i=0; i<M; i++) {
    for(int j=0; j<N; j++) {
      if(map[i][j] == 0 && visited[i][j] == false) {
        bfs(i, j);
        num.push_back(area);
        area=1; // area를 초기화
      }
    }
  }

  sort(num.begin(), num.end());
  cout << num.size() << '\n';
  for(int i=0; i<num.size(); i++) {
    cout << num[i] << '\n';
  }

  return 0;
}

좋은 웹페이지 즐겨찾기