Link : https://www.acmicpc.net/problem/2667
소스 결과 : 1992 KB /. 0 ms
출처 : BackJoon , KOI 1996 초등부 1번
설명
4 - Connectivity로 몇개의 개체가 존재 하는지 크기는 얼마인지 오름차순으로 나열하는 문제
입력이 띄어쓰기로 들어오는것이 아닌 line 단위로 들어오는점에 유의하여야한다.
n이 25로 제한되므로
최대 개체의 수는 313개 ( 25 * 12 + 13 )
위치를 저장하는 Queue와 구조체를 이용하면 간단히 풀린다.
알고리즘
1. (0,0) 에서 (n-1 , n-1) 까지 반복
2. 현재 조회 지점이 방문 기록이 없고 1이면 BFS 진행
2.1 현재 지점을 방문 한것으로 변경
2.2 현재 지점과 연결된 점을 Queue에 추가
2.3 현재 번호에 해당하는 개체의 크기를 1 추가
3. 개체 크기를 저장한 배열을 정렬
4. 개체의 개수를 출력 후 정렬된 개체 크기 배열을 출력
소스코드
#include <iostream>
using namespace std;
const short MAX_SIZE = 625;
struct mPoint {
short x;
short y;
mPoint() {}
mPoint(short x, short y) : x(x), y(y) {}
};
short map[25][25];
bool checker[25][25];
mPoint q[MAX_SIZE];
int head = 0;
int tail = 0;
const short posX[4] = { 1, 0 , -1, 0 };
const short posY[4] = { 0, 1, 0, -1 };
void push(short x, short y) {
q[head++ % MAX_SIZE] = mPoint(x, y);
}
mPoint pop() {
return q[tail++ % MAX_SIZE];
}
bool isEmpty() {
return head == tail;
}
int main()
{
int n;
int number = 0;
int sizeList[313];
cin >> n;
fill_n(sizeList, 313, 0);
for (int i = 0; i < n; i++)
{
char line[26];
cin >> line;
for (int j = 0; j < n; j++)
map[i][j] = int(line[j] - '0');
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (checker[i][j] || map[i][j] == 0)
continue;
push(i, j);
// BFS
while (!isEmpty())
{
mPoint cur = pop();
if (checker[cur.x][cur.y])
continue;
checker[cur.x][cur.y] = true;
sizeList[number]++;
for (int k = 0; k < 4; k++)
{
short nextX = cur.x + posX[k];
short nextY = cur.y + posY[k];
if (0 <= nextX && nextX < n && 0 <= nextY && nextY < n)
if (map[nextX][nextY] == 1)
push(nextX, nextY);
}
}
number++;
}
}
// Selection Sort
for (int i = 0; i < number; i++)
{
int min = i;
for (int j = i; j < number; j++)
if (sizeList[min] > sizeList[j])
min = j;
swap(sizeList[min], sizeList[i]);
}
cout << number << '\n';
for (int i = 0; i < number; i++)
cout << sizeList[i] << '\n';
return 0;
}
'Algorithm > BFS' 카테고리의 다른 글
BaekJoon 1260 DFS와 BFS (0) | 2019.01.08 |
---|---|
BaekJoon 1697 숨바꼭질 (0) | 2019.01.08 |
BaekJoon 2468 안전영역 (BFS) (0) | 2019.01.01 |
BaekJoon 11724 연결 요소의 개수 (BFS) (0) | 2019.01.01 |
BaekJoon 1325 효율적인 해킹 (0) | 2018.12.31 |