반응형
포인트
1. bfs 에서 각 영역에 대하여 번호를 붙이는 방법을 보여준다.
🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다.
#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
#include <algorithm>
using namespace std;
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int n;
int map[26][26];
bool visited[26][26];
vector<int> vc;
void bfs(int a, int b)
{
queue<pair<int, int>> q;
q.push({a, b});
visited[a][b] = 1;
int count = 1;
while (!q.empty())
{
int x, y;
tie(x, y) = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
if (!visited[nx][ny]&&map[nx][ny] == 1)
{
q.push({nx, ny});
visited[nx][ny] = 1;
count++;
}
}
}
vc.push_back(count);
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%1d", &map[i][j]);
}
}
int room = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (visited[i][j] == 0 && map[i][j] == 1)
{
room++;
bfs(i, j);
}
}
}
cout << room << '\n';
sort(vc.begin(), vc.end());
for (int i = 0; i < vc.size(); i++)
{
cout << vc[i] << '\n';
}
return 0;
}
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘] c++ cpp 가장 긴 증가하는 부분 수열 3 (0) | 2020.10.28 |
---|---|
[알고리즘] c++ cpp 가장 긴 증가하는 부분 수열 2 (0) | 2020.10.28 |
[알고리즘] 스탠다드 LCS - 최장 공통 부분 수열 (0) | 2020.10.28 |
[알고리즘] 스탠다드 BFS (너비 우선 탐색) (0) | 2020.10.28 |
[알고리즘] c++ cpp 방의 개수 (0) | 2020.10.24 |
댓글