https://www.acmicpc.net/problem/1926
2차원 배열을 다 돌면서 방문하지 않은 그림 좌표에서 시작, bfs를 통해서 인접한 그림이 있을 시 넓이를 하나씩 더 해주는 방식의 문제였다.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <limits.h>
#include <queue>
#include <set>
#include <math.h>
#include <stack>
#include <deque>
using namespace std;
int arr[501][501] = { 0 };
bool visited[501][501] = {};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
queue<pair<int, int>> q;
int n, m;
int cnt = 0, Max = 0;
// 상하좌우
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// 1이 있는지와 방문했는지 판별 후 bfs
if (arr[i][j] == 1 && !visited[i][j]) {
int tempMax = 0;
cnt++;
q.push(make_pair(i,j));
visited[i][j] = 1;
while (!q.empty()) {
int y = q.front().first;
int x = q.front().second;
tempMax++;
q.pop();
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;
if (visited[ny][nx] || !arr[ny][nx]) continue;
q.push({ ny, nx });
visited[ny][nx] = 1;
}
}
Max = max(Max, tempMax);
}
}
}
if (!cnt)
cout << "0\n0";
else
cout << cnt << '\n' << Max;
return 0;
}
'PS > BOJ' 카테고리의 다른 글
[백준] 7576. 토마토(c++) (0) | 2025.02.24 |
---|---|
[백준] 2178. 미로탐색(c++) (0) | 2025.02.24 |
[백준] 9012. 괄호(c++) (0) | 2025.02.16 |
[백준] 2504. 괄호의 값(c++) (0) | 2025.02.16 |
[백준] 10799. 쇠막대기(c++) (0) | 2025.02.12 |