BFS문제입니다. 모든 지역을 방문하고,
배추가 있는 지역에 방문했을 때, BFS로 연결되어있는 모든 지역을 다 방문합니다.
배추가 있는 지역을 처음 방문할 때의 횟수를 정답으로 출력해주면 됩니다.
#include <iostream>
#include <queue>
using namespace std;
int hatake[55][55];
bool visited[55][55];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
int m, n, k;
bool isSafe(int x, int y)
{
if (x >= 0 && x <= n - 1 && y >= 0 && y <= m - 1)
{
return true;
}
return false;
}
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> m >> n >> k;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
hatake[i][j] = 0;
visited[i][j] = false;
}
}
for (int i = 0; i < k; i++)
{
int x, y;
cin >> x >> y;
hatake[y][x] = 1;
}
int answer = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (hatake[i][j] == 1 && visited[i][j] == false)
{
answer++;
queue<pair<int, int>> q;
q.push(make_pair(i, j));
visited[i][j] = true;
while (!q.empty())
{
pair<int, int> p = q.front();
q.pop();
for (int k = 0; k < 4; k++)
{
if (isSafe(p.first + dx[k], p.second + dy[k]) && hatake[p.first + dx[k]][p.second + dy[k]] == 1 && visited[p.first + dx[k]][p.second + dy[k]] == false)
{
q.push(make_pair(p.first + dx[k], p.second + dy[k]));
visited[p.first + dx[k]][p.second + dy[k]] = true;
}
}
}
}
}
}
cout << answer << '\n';
}
return 0;
}
반응형
'Algorithm > 백준' 카테고리의 다른 글
백준 11724번 연결 요소의 개수 (c++) (0) | 2020.10.01 |
---|---|
백준 1764번 듣보잡 (c++) (0) | 2020.09.29 |
백준 1697번 숨바꼭질 (c++) (0) | 2020.09.29 |
백준 17626번 four squares (c++) (0) | 2020.09.27 |
백준 11049 행렬 곱셈 순서 (0) | 2020.09.21 |