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

이수진·2022년 2월 15일
0
post-custom-banner

문제는 다음과 같습니다.

전형적인 dfs문제이구요,
앞서서 풀었었던 문제에서 아주 조금 응용?된 문제라 보면 됩니다.

앞서서는, 상하좌우에 대해서만 관계가 성립했는데
📌이번문제는 대각선까지 섬의 범위가 포함됩니다.📌

그래서 dfs함수 내에도 대각선에 대해서도 dfs를 수행하도록 하였습니다.

문제가 간단하므로, 간단하게 짚고 넘어가겠습니다.

#include <bits/stdc++.h>
using namespace std;

int a[52][52]={0, };
int ch[52][52]={0, };
vector<int> res;
int tmp;

void DFS(int u, int v){
  ch[u][v]=1;

  // 상,하,좌,우,대각선에 대해서 dfs수행
  if(ch[u][v-1]==0 && a[u][v-1]==1) DFS(u, v-1);
  if(ch[u][v+1]==0 && a[u][v+1]==1) DFS(u, v+1);
  if(ch[u-1][v]==0 && a[u-1][v]==1) DFS(u-1, v);
  if(ch[u+1][v]==0 && a[u+1][v]==1) DFS(u+1, v);

  if(ch[u+1][v+1]==0 && a[u+1][v+1]==1) DFS(u+1, v+1);
  if(ch[u+1][v-1]==0 && a[u+1][v-1]==1) DFS(u+1, v-1);
  if(ch[u-1][v+1]==0 && a[u-1][v+1]==1) DFS(u-1, v+1);
  if(ch[u-1][v-1]==0 && a[u-1][v-1]==1) DFS(u-1, v-1);
}


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    while(1){
      int w, h; cin>>h>>w;
      if(w==0 && h==0) break;
      
      for(int i=1; i<=w; i++){
        for(int j=1; j<=h; j++){
          int tmp; cin>>tmp;
          a[i][j]=tmp;
        }
      } // 2차원 배열 입력받기 끝

      int tmp=0;
      for(int i=1; i<=w; i++){
        for(int j=1; j<=h; j++){
          if(ch[i][j]==0 && a[i][j]==1){
            DFS(i, j);
            tmp++; // 섬의 개수 count하기
          }
        }
      }
      cout<<tmp<<"\n"; // 섬의 개수 출력

      for(int i=1; i<=w; i++){
        for(int j=1; j<=h; j++){
          ch[i][j]=0;
          a[i][j]=0;
        }
      } // a배열, ch배열 초기화

    } // while문 끝
    return 0;
}
profile
꾸준히, 열심히, 그리고 잘하자
post-custom-banner

0개의 댓글