𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 4963번: μ„¬μ˜ 개수 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 4963번: μ„¬μ˜ 개수 - C++

.23 2021. 12. 27. 21:48
문제

μ •μ‚¬κ°ν˜•μœΌλ‘œ 이루어져 μžˆλŠ” 섬과 λ°”λ‹€ 지도가 주어진닀. μ„¬μ˜ 개수λ₯Ό μ„ΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

ν•œ μ •μ‚¬κ°ν˜•κ³Ό κ°€λ‘œ, μ„Έλ‘œ λ˜λŠ” λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” μ‚¬κ°ν˜•μ€ κ±Έμ–΄κ°ˆ 수 μžˆλŠ” μ‚¬κ°ν˜•μ΄λ‹€. 

두 μ •μ‚¬κ°ν˜•μ΄ 같은 섬에 있으렀면, ν•œ μ •μ‚¬κ°ν˜•μ—μ„œ λ‹€λ₯Έ μ •μ‚¬κ°ν˜•μœΌλ‘œ κ±Έμ–΄μ„œ 갈 수 μžˆλŠ” κ²½λ‘œκ°€ μžˆμ–΄μ•Ό ν•œλ‹€. μ§€λ„λŠ” λ°”λ‹€λ‘œ λ‘˜λŸ¬μ‹Έμ—¬ 있으며, 지도 λ°–μœΌλ‘œ λ‚˜κ°ˆ 수 μ—†λ‹€.

 

μž…λ ₯

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μ§€λ„μ˜ λ„ˆλΉ„ w와 높이 hκ°€ 주어진닀. w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

λ‘˜μ§Έ 쀄뢀터 h개 μ€„μ—λŠ” 지도가 주어진닀. 1은 λ•…, 0은 바닀이닀.

μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 두 개 주어진닀.

 

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, μ„¬μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.


μ•žμ„œ ν’€μ—ˆλ˜ 2667번 λ‹¨μ§€λ²ˆν˜ΈλΆ™μ΄κΈ°μ™€ 같은 λ°©μ‹μœΌλ‘œ ν’€ 수 μžˆλ‹€.

λ‹€λ§Œ, μ•žλ¬Έμ œμ™€ 달리 λŒ€κ°μ„  λ°©ν–₯도 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— dx, dy λ°©ν–₯에 μƒν•˜μ’Œμš°λΏ μ•„λ‹ˆλΌ λŒ€κ°μ„  λ°©ν–₯도 μΆ”κ°€ν•΄μ€€λ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MAX 51

int w, h;
int island[MAX][MAX];
int dx[] = {1, 0, -1, 0, 1, -1, 1, -1};
int dy[] = { 0, 1, 0, -1, 1, -1, -1, 1};

void DFS(int a, int b);

int main(void) {
    while(true) {
        int c = 0;
        scanf("%d %d", &w, &h);
        if(w == 0 && h == 0) break;

        for(int i = 1; i <= h; i++) {
            for(int j = 1; j <= w; j++) {
                scanf("%d", &island[i][j]);
            }
        }

        for(int i = 1; i <= h; i++) {
            for(int j = 1; j <= w; j++) {
                if(island[i][j] == 1) {
                    DFS(i, j);
                    c++;
                }
            }
        }

        printf("%d\n", c);
    }
    return 0;
}

void DFS(int a, int b) {
    island[a][b] = 0;

    for(int i = 0; i < 8; i++) {
        if((a + dy[i] < 1) || (a + dy[i] > h) || (b + dx[i] < 1) || (b + dx[i] > w))
            continue;
            
        if(island[a + dy[i]][b + dx[i]] == 1)
            DFS(a + dy[i], b + dx[i]);
    }
}
Comments