본문 바로가기

Problem/DFS

[백준알고리즘] 2638번 치즈

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





이렇게 푸는 문제가 맞나..? 그냥 내맘대로 풀었당


외부공기인 부분을 out배열로 표시했다.  계속 memset(out,0,sizeof(out)); 을 하면서 갱신하는데 이 부분이 마음에 안든다 나는 ㅠ

더 좋은 방법이 있을 것 같당.




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
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int v[101][101= { 0 };
 
int dx[4= { 0,0,-1,1};
int dy[4= { 1,-1,0,0 };
 
int out[101][101= { 0 };
int flag = 1;
 
int N, M;
 
void dfs(int _x, int _y)
{
    if(out[_x][_y] == 0) out[_x][_y] = 1;
 
    for (int i = 0; i < 4; i++)
    {
        int mx = _x + dx[i];
        int my = _y + dy[i];
    
        if (mx >= 0 && mx < N && my >= 0 && my < M && v[mx][my] == 0 && out[mx][my] == 0)
        {
            dfs(mx, my);
        }
    }
    return;
}
 
int main(void)
{
    int cnt = 0;
    int answer = 0;
 
    scanf("%d %d"&N, &M);
 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
            scanf("%d",&v[i][j]);
 
    while (flag)
    {
        flag = 0;
        memset(out, 0sizeof(out));
        dfs(00);
 
        for (int i = 1; i < N - 1; i++)
        {
            for (int j = 1; j < M - 1; j++)
            {
                for (int k = 0; k < 4; k++)
                {
                    int mx = i + dx[k];
                    int my = j + dy[k];
                    if (out[mx][my] == 1) cnt++;
                }
                if (v[i][j] == 1 && cnt >= 2) {
                    v[i][j] = 0; flag = 1;
                }
                cnt = 0;
            }
        }
        answer++;
    }
 
    printf("%d", answer-1);
 
    return 0;
}
cs