#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int Max = 25;
int N;
int DirX[4] = { -1,0,1,0 };
int DirY[4] = { 0,-1,0,1 };
int iCnt = 0;
char vvContents[25][25];
int vvChk[Max][Max] = { 0, };
vector<int> vDanji;
bool cmp(int x, int y)
{
return x < y; //내림차순 반환입니다.
}
void BFS(int x, int y)
{
queue<pair<int, int>> qTemp;
qTemp.push(make_pair(x, y));
vvChk[x][y] = 1;
iCnt++;
while (!qTemp.empty())
{
int iX = qTemp.front().first;
int iY = qTemp.front().second;
qTemp.pop();
for (int i = 0; i < 4; i++)
{
int iNX = iX + DirX[i];
int iNY = iY + DirY[i];
if ((vvChk[iNX][iNY] == 0) && (iNX >= 0) && (iNX < N) && (iNY >= 0) && (iNY < N) && (vvContents[iNX][iNY] == '1'))
{
iCnt++;
vvChk[iNX][iNY] = 1;
qTemp.push(make_pair(iNX, iNY));
}
}
}
}
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
cin >> vvContents[i];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if ((vvChk[i][j] == 0) && (vvContents[i][j] == '1'))
{
BFS(i, j);
vDanji.push_back(iCnt);
iCnt = 0;
}
}
}
sort(vDanji.begin(), vDanji.end(), cmp);
cout << vDanji.size() << endl;
for (int i = 0; i < vDanji.size(); i++)
{
cout << vDanji[i] << endl;
}
return 0;
}
이거 풀면서 해맸던게,
기존의 BFS와 다르게 0과 1 배열에서 끊긴부분(1이 연속적이지 않음)
끊긴부분을 위한 이중포문 만들어야함
끊긴부분을 구역별로 처리하기 위한 vector vDanji선언해야함.
백준풀때 배열 인풋 귀찮은데
char vvContents[25][25];
for (int i = 0; i < N; i++)
cin >> vvContents[i];
이런식으로 선언하고, 까먹지말고 vvContents[i][j] == '1'해줘야함. 문자열로 처리해준다. !=0으로 해서 empty한곳도 처리되서 계속 해맸음.