본문 바로가기
Algorithm/BFS DFS

[백준] 4963 섬의 개수 c++

by 젊은오리 2023. 3. 1.
728x90

 

문제 링크 https://www.acmicpc.net/problem/4963

Key

  • 대각선까지 총 8방향을 탐색해야 하는 문제이다.
  • 그것 외에는 다른 DFS,BFS유형의 문제들과 유사하게 순회 시 카운트를 증가하는 유형이기 때문에 쉽게 접근할 수 있었다.
  • height이 열, width이 행을 뜻하기 때문에 입력을 height, width순으로 받아야 한다.

 

1. DFS풀이

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
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
const int MAX = 51;
using namespace std;
int n;
int arr[MAX][MAX];
bool visited[MAX][MAX];
int dir[8][2= { {-1,0},{1,0},{0,1},{0,-1},{-1,1},{-1,-1},{1,-1},{1,1} };
int w, h;
 
void dfs(int x, int y) {
    for (int i = 0; i < 8; i++) { //8방향 탐색
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if (nx < 0 || nx >= w || ny < 0 || ny >= h)
            continue;
        if (visited[nx][ny])
            continue;
        if (arr[nx][ny] == 0)
            continue;
        visited[nx][ny] = true;
        dfs(nx, ny);
    }
}
int main()
{
    while (1) {
        int cnt = 0;
        memset(visited, falsesizeof(visited));
 
        cin >> h >> w;
        if (w == 0 && h == 0//종료조건
            break;
 
        for (int i = 0; i < w; i++) {
            for (int j = 0; j < h; j++) {
                cin >> arr[i][j];
            }
        }
        for (int i = 0; i < w; i++) {
            for (int j = 0; j < h; j++) {
                if (arr[i][j] == 1 && !visited[i][j]) {
                    visited[i][j] = true;
                    dfs(i, j);
                    cnt++;
                }
            }
        }
        cout << cnt << endl;
    }
}
 
cs

 

2. 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
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int MAX = 51;
int dir[8][2= { {-1,0},{1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1} };
int w, h;
int arr[MAX][MAX];
bool visited[MAX][MAX];
void bfs(int x, int y) {
    queue<pair<intint>> q;
    q.push({ x,y });
 
    while (!q.empty()) {
        int cx = q.front().first;
        int cy = q.front().second;
        q.pop();
 
        for (int i = 0; i < 8; i++) {
            int nx = cx + dir[i][0];
            int ny = cy + dir[i][1];
            if (visited[nx][ny])
                continue;
            if (nx < 0 || nx >= h || ny < 0 || ny >= w)
                continue;
            if (arr[nx][ny] == 0)
                continue;
 
            visited[nx][ny] = true;
            q.push({ nx,ny });
        }
    }
}
int main(void) {
    while (1) {
        cin >> w >> h;
        int answer = 0//갯수 초기화
        memset(visited, falsesizeof(visited)); //방문배열 초기화
        if (w == 0 && h == 0)
            break;
 
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                cin >> arr[i][j];
            }
        }
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                if (visited[i][j] == 0 && arr[i][j] == 1) {
                    bfs(i, j);
                    answer++//bfs순회를 시작할때마다 카운트 증가
                }
            }
        }
        cout << answer << endl;
    }
}
cs
728x90

댓글