반응형
난이도: Silver 2
번호: 11123
생성일: February 22, 2023 4:48 PM
알고리즘 분류: 그래프 이론, 그래프 탐색, 깊이 우선 탐색, 너비 우선 탐색
언어: C++
C++
BFS를 이용한 풀이
#include <iostream>
#include <queue>
using namespace std;
int T, H, W, res = 0;
char node[102][102];
bool visited[102][102];
const int dX[] = {1, -1, 0, 0};
const int dY[] = {0, 0, -1, 1};
void BFS(int i, int j)
{
// 좌표가 담긴 pair를 담을 queue 생성
queue<pair<int, int>> Q;
Q.push({i, j});
visited[i][j] = true;
// queue에 남은 값이 없다는건 시작 좌표의 '#'과 연결된 모든 '#'을 탐색했다는 것.
while (!Q.empty())
{
auto p = Q.front();
Q.pop();
// 상하좌우 체크
for (int k = 0; k < 4; k++)
{
int x = p.first + dX[k];
int y = p.second + dY[k];
if (node[x][y] != '#' || visited[x][y])
continue;
Q.push({x, y});
visited[x][y] = true;
}
}
}
// 입력된 값 초기화
void reset()
{
res = 0;
for (int i = 0; i < 102; i++)
for (int j = 0; j < 102; j++)
{
node[i][j] = false;
visited[i][j] = false;
}
}
int main(void)
{
cin.tie(0)->ios::sync_with_stdio(0);
cout.tie(0);
cin >> T;
while (T--)
{
// 리셋 후 값 입력
reset();
cin >> H >> W;
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
cin >> node[i + 1][j + 1];
// 처음부터 끝까지 다 확인해서 '#'이고 방문하지 않은 좌표를 찾아 너비우선탐색 시작.
for (int i = 1; i <= H; i++)
for (int j = 1; j <= W; j++)
if (node[i][j] == '#' && !visited[i][j])
{
// 너비우선 탐색으로 연결된 모든 #을 찾아 방문체크
BFS(i, j);
res++;
}
cout << res << "\n";
}
}
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ 6588] 골드바흐의 추측 C++ (0) | 2023.02.25 |
---|---|
[BOJ 13565] 침투 C++ (0) | 2023.02.25 |
[BOJ 11724] 연결요소의 개수 C++ (0) | 2023.02.13 |
[BOJ 4963] 섬의 개수 C++ (0) | 2023.02.09 |
[BOJ 1012] 유기농 배추 C++ (0) | 2023.02.08 |