백준
[백준BaekJoon]1926: 그림/C++
P1su
2023. 4. 17. 15:04
문제
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.
코드
BFS(너비우선탐색)문제이다.
기본적인 틀은 다른 BFS 문제와 다를 것 없고, 그림의 개수와 영역을 각각 어느 부분에서 카운트 해주는지가 중요하다.
#include <bits/stdc++.h>
using namespace std;
int arr[501][501];
bool vis[501][501] = { 0, };
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, m, num = 0, area, mx = 0;
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
queue<pair<int,int>> Q;//좌표값 넣는 큐
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (vis[i][j] == 0 && arr[i][j] == 1) {//방문하지 않았고 색칠이 된 구역
vis[i][j] = 1;
Q.push({ i,j });
num++;
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];//x,y 좌표를 상하좌우로 움직여줌
if (nx < 0 || nx > n || ny < 0 || ny > m)continue;//범위를 벗어나면 탐색 중단
if (arr[nx][ny] != 1 || vis[nx][ny] == 1)continue;//마찬가지로 탐색하는 구역이 이미 방문했거나 색칠이 안된 경우 탐색 중단
vis[nx][ny] = 1;
Q.push({ nx, ny });//새롭게 탐색할 구역 대입
}
}
mx = max(mx, area);
}
}
}
cout << num << "\n" << mx;
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
cout << ans[i][j]<<" ";
}
cout << "\n";
}
}
728x90