[C언어] 1012. 유기농배추

SW 업무 관련/백준

[C언어] 1012. 유기농배추

WillBe_ 2018. 8. 12. 20:28

오랜만에 백준!!!!

예전에 단지 번호 붙이기였나...그문제랑 비슷한듯.


Farm 배열에서 1인 부분에서 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
77
78
79
#include <stdio.h>
#include <string.h>
 
int M, N, NUM, a, b, Res;
int Farm[55][55= {0,};
 
typedef struct
{
    int x;
    int y;
}Point;
 
int BFS(int y, int x)
{
    int dx[] = { 0,0,1,-1 };
    int dy[] = { 1,-1,0,0 };
    Point Q[50 * 50= { 0, };
    int Q_Front = -1, Q_Back = -1;
 
    Q[++Q_Back].y = y;
    Q[Q_Back].x = x;
    Farm[y][x] = 0;
 
    while (Q_Front != Q_Back)
    {
        int xx = Q[++Q_Front].x;
        int yy = Q[Q_Front].y;
 
        for (int i = 0; i < 4; i++)
        {
            int xxx = xx + dx[i];
            int yyy = yy + dy[i];
 
            if (xxx < 0 || yyy < 0 || xxx >= M || yyy >= N)
                continue;
 
            if (Farm[yyy][xxx] == 1)
            {
                Q[++Q_Back].x = xxx;
                Q[Q_Back].y = yyy;
                Farm[yyy][xxx] = 0;
            }
        }
    }
 
    return 1;
}
 
int main()
{
    int Test;
    scanf("%d",&Test);
 
    for (int i = 0; i < Test; i++)
    {
        memset(Farm, 0sizeof(Farm));
        Res = 0;
        scanf("%d %d %d"&M, &N, &NUM);//가로, 세로 , 개수
        for (int j = 0; j < NUM;j++)
        {
            scanf("%d %d"&a, &b);
            Farm[b][a] = 1;
        }
 
        for (a = 0; a < N; a++)
        {
            for (b = 0; b < M; b++)
            {
                if (Farm[a][b] == 1)
                {
                    Res += BFS(a, b);
                }
            }
        }
        printf("%d\n",Res);
    }
 
    return 0;
}
cs