본문 바로가기
IT/BOJ

백준(BOJ) 2667 단지번호붙이기 *

by 빨강자몽 2019. 3. 14.

# BFS


각 지도를 돌면서 BFS 알고리즘을 실행시켜주면된다.


이미 이전에 방문한 단지는 방문하지 않는다!


#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define MAX 30
#define INF 2123456789

using namespace std;
typedef long long ll;
typedef pair<int,int> pi;

// map[0][][]에는 이전에 방문 여부를 저장하고
// map[1][][]에는 집의 유무를 저장한다.
int n, map[2][MAX][MAX];

// 4방향에 대해서 탐색한다.
int dy[4]={0,1,0,-1},dx[4]={1,0,-1,0};
vector<int> ans;
char str[MAX];

// bfs 알고리즘
void bfs(int y,int x)
{
    int cnt=1;
    queue<pi> q;
    q.push({y,x});
    while(!q.empty())
    {
        pi tmp = q.front();
        q.pop();
        
        // 4방향에 대해 탐색한다.
        for(int i=0;i<4;i++)
        {
            y=tmp.first+dy[i],x=tmp.second+dx[i];
            // 이전에 방문하지 않았고, 집이있다면
            if(map[0][y][x]==0&&map[1][y][x]==1)
            {
                // 방문표시를 해준다.
                map[0][y][x]=1;
                // 큐에 넣어준다.
                q.push({y,x});
                cnt++;
            }
        }
    }
    // 벡터에 집의 갯수를 넣어준다.
    ans.push_back(cnt);
}

int main() {
    // 초기화 및 입력
    fill_n(&map[0][0][0],2*MAX*MAX,0);
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",str);
        for(int j=0;j<n;j++)
            map[1][i+1][j+1]=str[j]-'0';
    }

    // 각 좌표에 방문한다.
    for(int i=1;i<=n;i++) {
        for (int j = 1; j <= n; j++) {
            // 이전에 방문하지 않았고, 집이있다면
            if (map[0][i][j] == 0 && map[1][i][j] == 1) {
                map[0][i][j] = 1;
                bfs(i, j);
            }
        }
    }

    // 정렬 하여준다.
    sort(ans.begin(),ans.end());
    // 전체 단지수를 출력하여준다.
    printf("%d\n",ans.size());
    // 집의 갯수를 출력하여준다.
    for(int i=0;i<ans.size();i++)
        printf("%d\n",ans[i]);
    return 0;
}


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 13458 시험 감독 *  (0) 2019.03.18
백준(BOJ) 2870 수학숙제 *  (0) 2019.03.17
백준(BOJ) 2665 미로만들기 *  (0) 2019.03.13
백준(BOJ) 16189 Repetitive Palindrome *  (0) 2018.10.07
백준(BOJ) 16190 Rising Sun **  (0) 2018.10.07