#BOJ 2583領域を取得
🖼 面積を求める
( https://www.acmicpc.net/problem/2583 )
ルーラーピッチ1のM×N(M,N≦100)サイズの四角紙があります.この四角紙にK個の矩形を目盛りで描画すると、これらK個の矩形の内部を除いて、残りの部分はいくつかの別々の領域に分割される.
例えば、M=5、N=7の四角紙に<図1>のように3つの矩形を描くと、残りの領域は<図2>のように3つの独立した領域に分割される.
「図2」に示すように、3つの領域の幅はそれぞれ1、7、13である.
M,N,K,K個の矩形の座標が与えられると,K個の矩形の内部を除いた残りの部分をいくつかの独立した領域に分割し,各分離領域の幅を求めることで出力プログラムを記述する.
入力
第1行MとN,Kは、スペースを隔てて順次与えられる.M,N,Kはいずれも100以下の自然数である.2行目からK行目まで、矩形左下角頂点のx、y座標値、右上角頂点のx、y座標値は、行ごとにスペースを隔てて順次与えられる.四角い紙の左下の頂点の座標は(0,0)、右上の頂点の座標は(N,M)です.入力したK個の長方形は、丸み紙全体を埋めません.
しゅつりょく
最初の行の区切り領域の数を出力します.2行目は各領域の幅を昇順に並べ、スペースを隔てて印刷します.
入力例1
5 7 3
0 2 4 4
1 1 2 5
4 0 6 2
サンプル出力1
3
1 7 13
インプリメンテーション
( https://www.acmicpc.net/problem/2583 )
시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 128 MB 25275 14108 11201 56.420%
質問するルーラーピッチ1のM×N(M,N≦100)サイズの四角紙があります.この四角紙にK個の矩形を目盛りで描画すると、これらK個の矩形の内部を除いて、残りの部分はいくつかの別々の領域に分割される.
例えば、M=5、N=7の四角紙に<図1>のように3つの矩形を描くと、残りの領域は<図2>のように3つの独立した領域に分割される.
「図2」に示すように、3つの領域の幅はそれぞれ1、7、13である.
M,N,K,K個の矩形の座標が与えられると,K個の矩形の内部を除いた残りの部分をいくつかの独立した領域に分割し,各分離領域の幅を求めることで出力プログラムを記述する.
入力
第1行MとN,Kは、スペースを隔てて順次与えられる.M,N,Kはいずれも100以下の自然数である.2行目からK行目まで、矩形左下角頂点のx、y座標値、右上角頂点のx、y座標値は、行ごとにスペースを隔てて順次与えられる.四角い紙の左下の頂点の座標は(0,0)、右上の頂点の座標は(N,M)です.入力したK個の長方形は、丸み紙全体を埋めません.
しゅつりょく
最初の行の区切り領域の数を出力します.2行目は各領域の幅を昇順に並べ、スペースを隔てて印刷します.
入力例1
5 7 3
0 2 4 4
1 1 2 5
4 0 6 2
サンプル出力1
3
1 7 13
インプリメンテーション
#include <bits/stdc++.h>
using namespace std;
int graph[102][102];
bool vis[102][102];
int m, n; //m : 가로 , n : 세로
int dx[]{ -1,1,0,0 };
int dy[]{ 0,0, -1,1 };
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int k; // 직사각형의 개수
cin >> m >> n >> k; //가로 세로 직사각형 개수 입력
for( int w = 0 ; w < k ; w ++)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
for (int i = x1; i < x2; i++)
{
for (int j = y1; j < y2; j++)
{
graph[i][j] = 1;
}
}
}
//이제 0인 구역을 bfs 돌려서 찾으면 됨
vector<int> area; // 영역의 넓이를 저장할 가변길이배열 선언
queue<pair<int, int>> Q;
int count = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (graph[i][j] == 1 || vis[i][j] == true) continue;
//0이고 아직 방문안했다면 아래
count++;
vis[i][j] = true;
Q.push({ i,j }); // 좌표 입력
int is_area = 0;
while (!Q.empty())
{
auto cur = Q.front(); Q.pop();
is_area++;
for (int dir = 0; dir < 4; dir++)
{
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (graph[nx][ny] == 1 || vis[nx][ny] == true) continue;
Q.push({ nx,ny });
vis[nx][ny] = true;
}
}
area.push_back(is_area);
}
}
sort(area.begin(), area.end());
cout << count << '\n';
for (auto& a : area)
{
cout << a << ' ';
}
return 0;
}
Reference
この問題について(#BOJ 2583領域を取得), 我々は、より多くの情報をここで見つけました https://velog.io/@versatile0010/BOJ-2583-영역-구하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol