코딩공작소

[백준]치즈1 본문

알고리즘/그래프

[백준]치즈1

안잡아모찌 2019. 8. 23. 17:08

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

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표시된다. 또한, 각 0과 1은 하나의 공백으로 분리되어 있다.

www.acmicpc.net

종종 외곽을 처리해야 했던 유형에서 볼 수 있던 문제다..

처음에는 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
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
 
int N, M;
int map[100][100];
bool isV[100][100];
queue<pair<intint> >q; 
int ans = 0;
int dr[] = { 0,0,-1,1 }, dc[] = { 1,-1,0,0 };
 
void bfs() {
    memset(isV, falsesizeof(isV));
    isV[0][0= true;
    q.push(make_pair(00));
 
    while (!q.empty()) {
        int r = q.front().first, c = q.front().second; q.pop();
 
        for (int i = 0; i < 4; i++) {
            int nr = r + dr[i], nc = c + dc[i];
            if (nr < 0 || nc < 0 || nr >= N || nc >= M || isV[nr][nc] == truecontinue;
            if (map[nr][nc] >= 1) {
                map[nr][nc] += 1;
                continue//치즈이면 하나 늘려줌.
            } //공기들만 탐색. (외부공기만) 내부까지 들어가지 않는다
            q.push(make_pair(nr, nc));
            isV[nr][nc] = true;
        }
    }
}
 
bool melt() {
    bool flag = false;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (map[i][j] >= 3) { //2변이상 닿음
                map[i][j] = 0; //녹이기
                flag = true;
            }
            else if (map[i][j] == 2) map[i][j] = 1//1변만 닿음
        }
    }
    return flag;
}
 
int main()
{
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> map[i][j];
        }
    }
    
    while (1) {
        bfs();  //공기를 bfs로 탐색(외곽들만 탐색하기위해서!!)
        if (melt()==true) ans++//녹으면 세서 진행.
        else break;
    }
 
    printf("%d\n", ans);
    return 0;
}
cs

'알고리즘 > 그래프' 카테고리의 다른 글

[SWEA]벽돌깨기  (0) 2019.08.25
[백준]치즈2  (0) 2019.08.23
[백준]연구소(두번째풂)  (0) 2019.08.20
[SWEA]등산로조성  (0) 2019.08.18
[백준]구슬탈출2(두번째)  (0) 2019.08.16