백준 1926 그림 C++
[문제 링크]
https://www.acmicpc.net/problem/1926
[입출력 예]
입력 | 출력 |
---|---|
6 5 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 |
4 9 |
[소스코드]
//시작시간 19:05
#include <bits/stdc++.h>
using namespace std;
int board[500][500];
int visited[500][500];
int n, m;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int max_area;
int cnt;
void print_borad()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << board[i][j] << " ";
}
cout << '\n';
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
// 입력 받기
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> board[i][j];
}
}
// 큐 생성, BFS.
queue<pair<int, int>> Q;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (visited[i][j] == 1)
continue;
// 방문한 지점이 아니며 1인 경우.
if (board[i][j] == 1)
{
// 방문표시
visited[i][j] = 1;
// 초기 너비 : 1
int area = 1;
cnt++;
// 해당 좌표를 큐에 삽입 후 BFS
Q.push(make_pair(i, j));
while (!Q.empty())
{
pair<int, int> cur = Q.front();
Q.pop();
for (int i = 0; i < 4; i++)
{
int nx = cur.first + dx[i];
int ny = cur.second + dy[i];
if (nx < 0 || nx > n - 1 || ny < 0 || ny > m - 1)
continue;
if (visited[nx][ny] == 1)
continue;
if (board[nx][ny] == 1)
{
area++;
visited[nx][ny] = 1;
Q.push({nx, ny});
}
}
}
max_area = (max_area < area) ? area : max_area;
}
}
}
cout << cnt << '\n'
<< max_area;
return 0;
}
// 처음에 ny범위를 m이 아니라 n 으로 적어서 틀림.
'PS > BOJ' 카테고리의 다른 글
백준 11729번 하노이 탑 이동순서 C++ (0) | 2022.02.08 |
---|---|
백준 1629 곱셈 C++ (0) | 2022.02.08 |
백준 5430 AC C++ 풀이 (0) | 2022.02.05 |
BOJ 1021 회전하는 큐 C++ (0) | 2022.02.02 |
백준 2164 카드2 c++ (0) | 2022.02.01 |
댓글
이 글 공유하기
다른 글
-
백준 11729번 하노이 탑 이동순서 C++
백준 11729번 하노이 탑 이동순서 C++
2022.02.08 -
백준 1629 곱셈 C++
백준 1629 곱셈 C++
2022.02.08 -
백준 5430 AC C++ 풀이
백준 5430 AC C++ 풀이
2022.02.05 -
BOJ 1021 회전하는 큐 C++
BOJ 1021 회전하는 큐 C++
2022.02.02