기술 블로그

16988번 Baaaaaaaaaduk2 (Easy) 본문

알고리즘 문제/BOJ

16988번 Baaaaaaaaaduk2 (Easy)

parkit 2019. 4. 1. 14:59
728x90
반응형

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



BackTracking + BFS 문제이다.


참고로 이 코드에서 배열 크기를 1010으로 늘려, 16989번 Baaaaaaaaaduk2 (Hard) 문제에 제출하면, 시간 초과가 뜬다.



Easy 문제를 살펴보면,


simulation() 함수 안에서 MAX = max(MAX, s);이중 for문이 모두 끝난 뒤에 계산을 해야한다.


이는 아래의 예제를 통해 이유를 알 수 있다.(아래의 예제는 8 + 5 = 13이 나온다.)


만약 이중 for문 안에서 MAX = max(MAX, s);를 구현하면, 최댓값이 8이 나와버린다.





입력

8 6

0 0 1 2 2 2

0 0 1 2 2 2

0 1 1 0 2 2

1 2 2 0 1 1

1 2 2 1 0 0

1 2 1 0 2 0

1 1 0 0 0 1

0 1 0 0 0 0


출력

13







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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
#include <map>
#include <set>
#include <sstream>
#include <tuple>
 
#pragma warning(disable:4996)  
#pragma comment(linker, "/STACK:336777216")
 
using namespace std;
 
int Map[22][22= { 0, }, N = 0, M = 0;
 
int dy[4= { 010-1 };
int dx[4= { 10-10 };
 
int MAX = 0, cnt = 0;
 
bool use[22][22= { false, }, zero = false;
 
bool visit[22][22= { false, };
 
void DFS(int r, int c)
{
    visit[r][c] = true;
 
    ++cnt;
 
    for (int i = 0; i < 4; i++)
    {
        int y = r + dy[i];
        int x = c + dx[i];
 
        if (y < 0 || y >= N || x < 0 || x >= M || Map[y][x] == 1 || visit[y][x]) continue;
 
        if (Map[y][x] == 2) DFS(y, x);
        
        else if (Map[y][x] == 0) zero = true// zero가 있다고 해서, return 하면 안 된다.
    }
}
 
void simulation(int c)
{
    if (c == 2)
    {
        memset(visit, falsesizeof(visit));
 
        int s = 0;
 
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                if (!visit[i][j] && Map[i][j] == 2)
                {
                    zero = false;
 
                    cnt = 0;
 
                    DFS(i, j);
 
                    if (zero) cnt = 0// zero가 있다면 당연히 cnt를 0으로 하여, max 계산에 미적용 되게 한다.
 
                    s += cnt;
                }
            }
        }
 
        MAX = max(MAX, s);
 
        return;
    }
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++
        {
            if (!use[i][j] && Map[i][j] == 0)
            {
                Map[i][j] = 1;
                use[i][j] = true;
 
                simulation(c + 1);
 
                Map[i][j] = 0;
                use[i][j] = false;
            }
        }
    }
}
 
int main(void)
{
    MAX = -1;
 
    scanf("%d %d"&N, &M);
 
    for (int i = 0; i < N; i++for (int j = 0; j < M; j++scanf("%d"&Map[i][j]);
 
    simulation(0);
 
    printf("%d\n", MAX);
 
    return 0;
}
cs




























728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

15686번 치킨 배달  (0) 2019.04.03
15683번 감시  (0) 2019.04.02
16945번 매직 스퀘어로 변경하기  (0) 2019.03.30
16936번 나3곱2  (0) 2019.03.29
6087번 레이저 통신  (0) 2019.03.28