반응형

문제 출처 :


https://www.acmicpc.net/problem/2667



알고리즘 분석 :


문제 해결에 필요한 사항

1. BFS


BFS를 통해 문제를 해결할 수 있다.


모든 좌표를 돌며 이미 방문한 점이면 return을 해주고 그 외에는 BFS를 돌며 BFS가 돌았던 총 횟수가 정답이 된다.






소스 코드 : 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
 
using namespace std;
 
typedef pair<intint> pii;
 
char map[30][30];
bool visit[30][30];
 
int n, cnt;
int house[1000];
 
int dy[4= { -1,0,1,};
int dx[4= { 0,-1,0,};
 
 
void bfs(int y, int x)
{
    queue<pii> q;
 
    if (visit[y][x] || map[y][x] == '0')
        return;
 
    cnt++;
 
    q.push(pii(y, x));
 
    while (!q.empty())
    {
        int hy = q.front().first;
        int hx = q.front().second;
 
        q.pop();
 
        if (visit[hy][hx])
            continue;
 
        house[cnt - 1]++;
        visit[hy][hx] = true;
 
        for (int i = 0; i < 4; i++)
        {
            int ny = hy + dy[i];
            int nx = hx + dx[i];
 
            if ((<= ny && ny < n) && (<= nx && nx < n && map[ny][nx] == '1'))
                q.push({ ny,nx });
        }
    }
}
int main()
{
    scanf("%d"&n);
 
    for (int i = 0; i < n; i++)
        scanf("%s", map[i]);
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            bfs(i, j);
 
    printf("%d\n", cnt);
 
    sort(house, house + cnt);
 
    for (int i = 0; i < cnt; i++)
        printf("%d\n", house[i]);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[11559번] Puyo Puyo  (0) 2018.01.26
[4963번] 섬의 개수  (0) 2018.01.24
[12913번] 매직 포션  (0) 2018.01.23
[3055번] 탈출  (0) 2018.01.21
[7453번] 합이 0인 네 정수  (0) 2018.01.21