boj1926-풀이
풀이
그래프 문제
queue
를 사용하는 bfs를 통해 풀었다.
queue
에는 다음으로 탐색할 노드위 위치(y, x)를 저장.
- $n \times m$크기의 맵에서 순차적으로 탐색하여, 탐색할 노드(
1
)를 찾아서queue
에 넣는다.
탐색할 노드를 찾으면,- 현재 그림의 크기를
1
로 초기화 - 그림의 수에
1
을 더한다. - 다음에 다시 방문하지 않도록
방문처리
를 한다.
(이후 bfs 진행)
queue
가 비어있지 않으면 2번부터, 비어있다면 4번부터 실행queue
에서 뽑아냄(pop)- 뽑아낸 원소의 인접 4방향에 대해서, 다음으로 탐색할 노드를 찾는다.
다음으로 탐색할 노드는 아직 탐색하지 않은 노드로 값이 1임. 탐색할 노드를 찾으면,- 다음에 다시 방문하지 않도록
방문처리
를 한다.(값을 0으로 변경한다. 0=방문완료, 1=미방문) - 다음에 탐색하도록
queue
에 넣는다. - 현재 그림의 크기에
1
을 더한다.
- 다음에 다시 방문하지 않도록
- 현재 그림의 크기와 기존 최대 그림의 크기를 비교하여 더 큰 그림의 크기를 저장한다.
- 현재 그림의 크기를
- 그림의 수, 가장 큰 그림의 크기 출력!
구현
#include <bits/stdc++.h>
using namespace std;
#define Y first
#define X second
typedef pair<int, int> pii;
bool isInArea(int y, int x, int my, int mx, int My, int Mx) {
return (my <= y && y < My) && (mx <= x && x < Mx);
}
bool isInArea(pii cur, pii picMin, pii picMax) {
return isInArea(cur.Y, cur.X, picMin.Y, picMin.X, picMax.Y, picMax.X);
}
pii operator+(const pii& origin, const pii& sum) {
return { origin.first + sum.first, origin.second + sum.second };
}
pii ways4[] = { // {y, x}
{-1, 0}, //up
{1, 0}, //down
{0, -1},//left
{0, 1},//right
};
pii msize;
int arr[500][500];
queue<pii> q;
int picMax = 0, picCnt;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> msize.Y >> msize.X;
for (int i = 0; i < msize.Y; ++i)
for (int j = 0; j < msize.X; ++j)
cin >> arr[i][j];
for (int i = 0; i < msize.Y; ++i){
for (int j = 0; j < msize.X; ++j) {
if (arr[i][j]) {
++picCnt;
arr[i][j] = 0;
q.push({ i, j });
int picSize = 1;
// bfs
while (!q.empty()) {
pii cur = q.front();
q.pop();
for (int i = 0; i < 4; ++i) {
pii next = cur + ways4[i];
if (isInArea(next, { 0, 0 }, msize) && arr[next.Y][next.X]) {
++picSize;
arr[next.Y][next.X] = 0;
q.push(next);
}
}
}
picMax = max(picMax, picSize);
}
}
}
cout << picCnt << '\n' << picMax;
return 0;
}
TMI
전역전 휴가~ :)
댓글남기기