[백준/C++] 2583번 영역 구하기
2021. 3. 28. 19:12ㆍ알고리즘/BFS DFS
728x90
반응형
문제: www.acmicpc.net/problem/2583
2583번: 영역 구하기
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오
www.acmicpc.net
문제풀이
배열 board에서 입력으로 주어진 좌표 범위를 모두 1로 초기화하고 0인 부분을 BFS했다.
코드
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
int visited[100][100] = {0,};
int board[100][100] = {0,};
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
int m,n,k;
cin>>m>>n>>k;
while(k--){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
for(int i=y1; i<y2; i++){ //주어진 좌표 1로 초기화
for(int j=x1; j<x2; j++){
board[i][j] = 1;
}
}
}
vector<int> varea;
queue<pair<int,int>> q;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(visited[i][j] || board[i][j]) continue; //방문했거나 board값이 1이면 continue
q.push({i,j});
visited[i][j] = 1;
int area = 0; //영역의 넓이
while(!q.empty()){
pair<int,int> cur = q.front();
q.pop();
area++;
for(int dir=0; dir<4; dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx<0 || nx>=m || ny<0 || ny>=n) continue;
if(visited[nx][ny] || board[nx][ny]) continue;
q.push({nx,ny});
visited[nx][ny] = 1;
}
}
varea.push_back(area);
}
}
sort(varea.begin(), varea.end()); //영역의 넓이 오름차순 정렬
cout<<varea.size()<<"\n"; //영역의 개수
for(auto a : varea)
cout<<a<<" ";
return 0;
}
결과

728x90
반응형
'알고리즘 > BFS DFS' 카테고리의 다른 글
[백준/C++] 2667번 단지번호붙이기 (0) | 2021.03.29 |
---|---|
[백준/C++] 7562번 나이트의 이동 (0) | 2021.03.29 |
[백준/C++] 9466번 텀 프로젝트 (0) | 2021.03.28 |
[백준/C++] 7569번 토마토 (0) | 2021.03.27 |
[백준/C++] 1012번 유기농 배추 (0) | 2021.03.27 |