알고리즘/백준

[백준 2636] 치즈 (C++)

겜도리도리 2021. 8. 18. 10:45
반응형

문제

백준 2636

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

풀이

전형적인 bfs 문제였습니다.

먼저 치즈의 개수를 세주고 temp에 저장합니다.

(0,0)은 무조건 공기이므로 bfs를 이용해 공기와 맞닿은 치즈들을 모두 공기로 바꿔줍니다.

다시 치즈의 개수를 세고, 치즈가 없다면 temp와 hour를 출력하고 있다면 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
 
int map[100][100];
bool visited[100][100];
int n, m;
int dx[] = { 00-11 };
int dy[] = { 1-100 };
int cnt = 0;
int temp = 0;
int hour = 0;
void bfs(int a, int b)
{
    if (visited[a][b])
        return;
    visited[a][b] = true;
    queue<pair<intint>> q;
    q.push(make_pair(a, b));
    while(!q.empty())
    {
        int x = q.front().second;
        int y = q.front().first;
        q.pop();
        if (map[y][x] == 0)
        {
            for (int i = 0; i < 4; i++)
            {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx >= 0 && nx < m && ny >= 0 && ny < n && !visited[ny][nx])
                {
                    visited[ny][nx] = true;
                    q.push(make_pair(ny, nx));
                }
            }
        }
        else
        {
            map[y][x] = 0;
        }
    }
}
 
int main()
{
    cin >> n >> m;
    bool checkzero = true;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> map[i][j];
        }
    }
    while (1)
    {
        memset(visited, 0sizeof(visited));
        cnt = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (map[i][j] == 1)
                    cnt++;
            }
        }
        if (cnt == 0)
        {
            cout << hour << endl;
            cout << temp << endl;
            break;
        }
        else
        {
            temp = cnt;
            bfs(00);
            hour++;
        }
            
    }
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1756] 피자 굽기 (C++)  (0) 2021.08.19
[백준 5557] 1학년 (C++)  (0) 2021.08.19
[백준 2812] 크게 만들기 (C++)  (0) 2021.08.19
[백준 16234] 인구 이동 (C++)  (0) 2021.08.18
[백준 2075] N번째 큰 수 (C++)  (0) 2021.08.18