알고리즘

[백준/DFS/C++] 4963번 섬의 개수

데메즈 2022. 12. 30. 17:40
728x90
반응형

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

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

이 문제는 dfs를 이용해서 풀었다
*이차원배열*

arr[0][0]
arr[0][1]
arr[0][2]
arr[0][3]
arr[1][0]
arr[1][1]
arr[1][2]
arr[1][3]
arr[2][0]
arr[2][1]
arr[2][2]
arr[2][3]
#include <bits/stdc++.h>

using namespace std;

int w, h;
int graph[51][51];

bool dfs(int x, int y){
    // 범위 벗어나는 경우
    if(x<=-1 || x>=h || y<=-1 || y>=w) return false;
    // 바다인 경우
    if(graph[x][y]==0) return false;
    // 땅인 경우
    if(graph[x][y]==1){
        graph[x][y] = 0;

        dfs(x-1,y);
        dfs(x+1,y);
        dfs(x,y-1);
        dfs(x,y+1);
        dfs(x-1,y+1);
        dfs(x+1, y+1);
        dfs(x+1, y-1);
        dfs(x-1, y-1);

        return true;
    }
    return false;
}

int main(void) {

    while(1){
        cin >> w >> h;
        if(w==0 & h==0) break;

        for(int i=0; i<h; i++){
            for(int j=0; j<w; j++){
                cin >> graph[i][j];
            }
        }

        int result = 0;
        for(int i=0; i<h; i++){
            for(int j=0; j<w; j++){
                if(dfs(i,j)){
                    result++;
                }
            }
        }
        cout << result << endl;
    }

    return 0;
}
728x90
반응형