본문 바로가기

BOJ

BOJ 4963 섬의 개수

- DFS(x,y,cnt)로 넘겼을 때 0ms

- BFS(x,y,cnt)로 넘겼을 때 4ms

- BFS(x,y)로 넘겼을 때 0ms

 

- w, h의 위치를 잘 보고 입력 받아야 한다.

 

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

 

 

* DFS 풀이

#include <cstdio>
using namespace std;

int map[52][52];
int visited[52][52];

int w,h,cnt;

int dx[8]={-1,0,1,-1,1,-1,0,1};
int dy[8]={1,1,1,0,0,-1,-1,-1};

void dfs(int x, int y, int cnt){
  visited[x][y]=cnt;

  for(int i=0; i<8; i++){
    int nx = x + dx[i];
    int ny = y + dy[i];

    if(nx>=0 && ny>=0 && nx<h && nx<w){
      if(map[nx][ny]==1 && visited[nx][ny]==0){
        dfs(nx,ny,cnt);
      }
    }
  }

  // for(int i=0; i<h; i++){
  //   for(int j=0; j<w; j++){
  //     printf("%d ", visited[i][j]);
  //   }printf("\n");
  // }
}

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

    for(int i=0; i<h; i++){
      for(int j=0; j<w; j++){
        scanf("%d", &map[i][j]);
        visited[i][j]=0;
      }
    } //input end

    cnt = 0;
    for(int i=0; i<h; i++){
      for(int j=0; j<w; j++){
        if(map[i][j]==1 && visited[i][j]==0){
          dfs(i,j,++cnt);
        }
      }
    }
    //output field
    printf("%d\n", cnt);
  } //while end
}

 

 

 

* BFS 풀이

#include <cstdio>
#include <queue>
using namespace std;

int map[52][52];
int visited[52][52];

int w,h,cnt;

int dx[8]={-1,0,1,-1,1,-1,0,1};
int dy[8]={1,1,1,0,0,-1,-1,-1};

void bfs(int x, int y){
  queue<pair<int, int> > q;
  q.push(make_pair(x,y));
  visited[x][y]=1;

  while(!q.empty()){
    x = q.front().first;
    y = q.front().second;
    q.pop();

    for(int i=0; i<8; i++){
      int nx = x + dx[i];
      int ny = y + dy[i];

      if(nx>=0 && ny>=0 && nx<h && ny<w){
        if(map[nx][ny]==1 && visited[nx][ny]==0){
          q.push(make_pair(nx,ny));
          visited[nx][ny]=1;
        }
      }
    }
  }
}

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

    for(int i=0; i<h; i++){
      for(int j=0; j<w; j++){
        scanf("%d", &map[i][j]);
        visited[i][j]=0;
      }
    } //input end

    cnt = 0;
    for(int i=0; i<h; i++){
      for(int j=0; j<w; j++){
        if(map[i][j]==1 && visited[i][j]==0){
          //dfs(i,j,++cnt);
          bfs(i,j);
          cnt++;
        }
      }
    }
    //output field
    printf("%d\n", cnt);
  } //while end
}

'BOJ' 카테고리의 다른 글

BOJ 11726 2×n 타일링  (0) 2019.07.18
BOJ 1463 1로 만들기  (0) 2019.07.18
BOJ 2667 단지번호붙이기  (0) 2019.04.13
BOJ 2468 안전 영역 DFS  (0) 2019.04.07
BOJ 10026 적록색약  (0) 2019.04.07