[2583] 영역구하기

!·2022년 7월 5일
0

BFS/DFS

목록 보기
11/17

내 코드

#include <stack>
#include <iostream>
#include <queue>
#include <algorithm>
#include <deque>

using namespace std;

int field[100][100];
bool isvisit[100][100];
int xdis[4] = {1,0,-1,0};
int ydis[4] = {0,1,0,-1};
int x,y, xx,yy;
int m,n,k;
deque<int> d;

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n >> k;
    while(k--)
    {
        cin >> x >> y;
        cin >> xx >> yy;
        for(int i = y;i<yy;i++)
        {
            for(int j = x;j<xx;j++)
            {
                field[i][j] = 1;
            }
        }
    }
    queue<pair<int,int>> q;
    int ans = 0;
    int sum = 1;
    for(int i = 0;i<m;i++)
    {
        for(int j = 0;j<n;j++)
        {
            if(isvisit[i][j] == false && field[i][j] == 0)
            {
                ans++;
                q.push({i,j});
                isvisit[i][j] = true;
                while(!q.empty())
                {
                    pair<int,int> cur = q.front(); q.pop();
                    for(int f = 0;f<4;f++)
                    {
                        int cury = cur.first + ydis[f];
                        int curx = cur.second + xdis[f];
                        if(curx<0||curx>=n||cury<0||cury>=m) continue;
                        if(field[cury][curx] == 1 || isvisit[cury][curx]) continue;
                        q.push({cury,curx});
                        isvisit[cury][curx] = true;
                        sum++;
                    }
                }
                d.push_back(sum);
                sum = 1;
            }
        }
    }
    cout << ans << '\n';
    sort(d.begin(),d.end());
    while(!d.empty())
    {
        cout << d.front() << ' ';
        d.pop_front();
    } 
}

정답

include <bits/stdc++.h>
using namespace std;

#define X first
#define Y second
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int m, n, k;
int board[102][102];
int vis[102][102];

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> m >> n >> k;
  while (k--) {
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    for (int j = y1; j < y2; j++)
      for (int k = x1; k < x2; k++)
        board[j][k] = 1;
  }

  int count = 0;
  vector<int> ans;
	
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      if (board[i][j] == 1 || vis[i][j] == 1)
        continue;
      queue<pair<int, int>> Q;
      vis[i][j] = 1;
      Q.push({ i, j });
      int width = 1;
      count++;
      while (!Q.empty()) {
        auto cur = Q.front();
        Q.pop();
        for (int dir = 0; dir < 4; dir++) {
          int nx = cur.X + dx[dir];
          int ny = cur.Y + dy[dir];
          if (nx < 0 || nx >= m || ny < 0 || ny >= n)
            continue;
          if (board[nx][ny] == 1 || vis[nx][ny] == 1)
            continue;
          Q.push({ nx, ny });
          vis[nx][ny] = 1;
          width++;
        }
      }
      ans.push_back(width);
    }
  }
  sort(ans.begin(), ans.end());

  cout << count << '\n';
  for (int i : ans)
    cout << i << ' ';

  return 0;  
}
profile
개발자 지망생

0개의 댓글