[BEAKJOON] 4963_섬의 개수_C언어

SW 업무 관련/백준

[BEAKJOON] 4963_섬의 개수_C언어

WillBe_ 2017. 8. 30. 00:14

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


풀이


여행을 갔다 오느라..오랜만에 문제를 풀었다!!근데 이건...예전에 풀었던 '2667번단지번호붙이기'와 매우 흡사하여 금방 풀었다.


map배열과 방문을 체크하는 visit배열을 선언 후

이중 반복문으로 map배열을 다 체크해주며 map의 해당 값이 1이며 방문한 적이 없는 곳이면 이 곳을 기준으로 상하좌우 대각선을 탐색해준다.


더 이상 이어진 섬이 없으면 return 1을 해주어 이 1의 총 합을 출력해주기만 하면 된다.



제출 코드

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
#include <stdio.h>
int H, W, num, map[60][60], visit[60][60];
int dx[] = { 0,1,1,1,0,-1,-1,-1 };
int dy[] = { -1,-1,0,1,1,1,0,-1 };
 
void reset(int *int);
int search(int y, int x)
{
    if (!map[y][x]||visit[y][x])
        return 0;
    
    visit[y][x] = 1;
 
    for (int i = 0; i < 8; i++)
    {
            int xx = x + dx[i];
            int yy = y + dy[i];
            if (map[yy][xx]&&!visit[yy][xx])
                search(yy, xx);
    }
 
    return 1;
}
 
int main()
{
    while (1)
    {
        num = 0;
        reset(map, sizeof(map) / 4);
        reset(visit,sizeof(visit) / 4);
        scanf("%d %d"&W, &H);
 
        if (W == 0 && H == 0)
            return 0;
 
        for (int i = 1; i <= H; i++)
            for (int j = 1; j <= W; j++)
                scanf("%d"&map[i][j]);
 
        for (int i = 1; i <= H; i++)
        {
            for (int j = 1; j <= W; j++)
            {
                num = search(i, j);
            }
        }
        printf("%d\n", num);
    }
 
    return 0;
}
 
void reset(int * arr, int size)
{
    for (int i = 0; i < size; i++)
        arr[i] = 0;
}
cs