본문 바로가기
Programming/Algorithm

백준 14502 연구소

by OKOK 2018. 4. 14.

1. 설계를 명확하게 합니다. (예제 3개 돌리기)

2. 경우의 수를 나열합니다 (자세히_

3. 초기화 조건을 확인합니다.

4. 가지치기를 합니다. 


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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
1. 설계 완벽하게 하기(예제 3개 돌리기)
2. 초기화 조건 확인하기
3. 경우의 수 나열하기
4. 가지치기
17:23 
1. 벽을 세우는 dfs 함수
2. 바이러스 퍼트리는 bfs 함수
3. 숫자 세는 함수
4. 맵 리셋하는 함수
*/
 
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
 
#define SIZE 9
int map[SIZE][SIZE];
int visit[SIZE][SIZE];
int safe_cnt;
int maxVal;
struct point {
    int x, y;
};
queue<point> que;
int N, M;
int x, y, nx, ny;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int map_store[SIZE][SIZE];
 
void problemIn() {
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> map[i][j];
        }
    }
}
 
void visit_init() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            visit[i][j] = 0;
        }
    }
}
 
void copy_map(int(*a)[SIZE], int(*b)[SIZE]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            b[i][j] = a[i][j];
        }
    }
}
 
void bfs() {
    while (!que.empty()) {
        x = que.front().x;
        y = que.front().y;
        que.pop();
        for (int i = 0; i < 4; i++) {
            nx = x + dx[i];
            ny = y + dy[i];
            if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
            if (map[nx][ny] == 0 && visit[nx][ny] == 0) {
                visit[nx][ny] = 1;
                map[nx][ny] = 2;
                que.push({ nx,ny });
            }
        }
    }
}
 
void dfs(int depth, int startI) {
 
    if (depth == 3) {
        
        visit_init();
        copy_map(map, map_store); // 바이러스 퍼트리기 전에 저장
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (map[i][j] == 2) {
                    visit[i][j] = 1;
                    que.push({ i,j });
                    bfs();
                }
            }
        }
 
 
 
        // 안전 영역 갯수 세기
        safe_cnt = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (map[i][j] == 0) {
                    safe_cnt++;
                }
            }
        }
 
        copy_map(map_store, map); // 바이러스 퍼트리기 전으로 되돌림
        maxVal = max(maxVal, safe_cnt);
        return;
    }
 
    for (int i = startI; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (map[i][j] == 0) {
                map[i][j] = 1;
                dfs(depth + 1, i);
                map[i][j] = 0;
            }
        }
    }
}
 
 
void solve() {
    // 벽 3개 세우는 함수
    dfs(00);
}
 
int main() {
    problemIn();
    solve();
    cout << maxVal << endl;
    return 0;
}
cs