문제
2583번: 영역 구하기
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오른쪽 위 꼭짓점의 x, y좌표값이 빈칸을 사이에 두고 차례로 주어진다. 모눈종이의 왼쪽 아래 꼭짓점의 좌표는 (0,0)이고, 오른쪽 위 꼭짓점의 좌표는(N,M)이다. 입력되는 K개의 직사각형들이 모눈종이 전체를 채우는 경우는 없다.
www.acmicpc.net
해결 방법
저번주에 도전하다가 결국 실패해서 과제로 제출하지 못한 문제이다.
연휴라 시간도 많고 이걸 해결하지 못하면 다른 bfs문제도 풀 수 없을 것 같아서 다시 도전하기로 했다.
내가 생각하는 좌표의 시작점과, 컴퓨터가 입력받는 좌표의 시작점과 다른 것을 주의해서 보면 됐던 문제.
![]() |
![]() |
내가 원하는 좌표평면은 원점이 왼쪽아래지만 컴퓨터 상에서 원점은 왼쪽상단이기 때문에
이걸 바꿔주는 작업이 필요하다.
![]() |
![]() |
예를 들어 x1, y1, x2, y2를 각각 0, 2, 4, 4로 입력받았다면,
컴퓨터 상의 좌표평면에서 2행 3 ~ 0열, 1행 3 ~ 0열 이렇게 순환하도록 만들 것이다.
그래서!
행은 (m - 1 - y1)부터 시작해서 (y2 - y1)만큼 순환하면 되므로 (m - 1 - y1) - (y2 - y1 - 1) = (m - y2)까지 돌면 되고,
열은 내가 입력한 상태나 컴퓨터가 입력받은 상태나 똑같기 때문에 x2 - 1부터 x1까지 순환하게 만들면 된다.
내 코드(C++)
/*[2583] 영역구하기*/
/*https://www.acmicpc.net/problem/2583*/
/*BFS*/
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int m, n; //height, width
int cnt = 0; //the number of connected components
int maze[101][101] = { 0, };
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
vector<int>area;
void bfs(int x, int y);
int main(void)
{
int k; //the number of squares
int x1, x2, y1, y2;
cin >> m >> n >> k;
for (int i = 0; i < k; i++) {
cin >> x1 >> y1 >> x2 >> y2;
//row
for (int j = m - 1 - y1; j >= m - y2; j--) {
//column
for (int k = x2 - 1; k >= x1; k--) {
if(maze[j][k]==0) //empty
maze[j][k] = 1;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
//empty
if (maze[i][j] == 0)
bfs(i, j);
}
}
cout << cnt << endl;
sort(area.begin(), area.end());
for (int i = 0; i < area.size(); i++) {
cout << area[i] << " ";
}
return 0;
}
void bfs(int x, int y)
{
int sum = 0; //area of connected component
queue<pair<int, int> >q;
q.push(make_pair(x, y));
maze[x][y] = 2; //visited
while (!q.empty()) {
x = q.front().first;
y = q.front().second;
q.pop();
sum++;
//east, north, west, south
for (int i = 0; i < 4; i++) {
int nextx = x + dx[i];
int nexty = y + dy[i];
if (0 <= nextx && nextx < m && 0 <= nexty && nexty < n && maze[nextx][nexty] == 0) {
maze[nextx][nexty] = 2;
q.push(make_pair(nextx, nexty));
}
}
}
area.push_back(sum);
cnt++; //bfs end
}
'Baekjoon > BFS' 카테고리의 다른 글
[10451] 순열 사이클(C++) (0) | 2020.01.10 |
---|---|
[1260] DFS와 BFS(C++) (0) | 2019.09.15 |
[1697] 숨바꼭질(C++) (0) | 2019.09.15 |
[10026] 적록색약(C++) (0) | 2019.09.15 |
[2178] 미로 탐색(C++) (0) | 2019.09.01 |