이 문제도 N이 작기 때문에 3개의 기둥을 한번씩 다 세워보고 최대값을 찾는 완전탐색 문제입니다.
dfs는 기둥을 세우는 함수이며, 깊이가 3이 되었을 때(기둥을 세개 세웠을 때) bfs함수를 호출합니다.
bfs는 바이러스가 퍼지는 함수 입니다. bfs가 끝나면 recovery함수를 호출해서 바이러스가 퍼지기 전의 맵 상태로 돌리며,
돌릴 때 0의 개수도 같이 세서 리턴하는 함수입니다.
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 135 136 137 138 139 140 141 142 | #include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <string.h> #include <vector> #include <functional> #define MAX_SIZE 8 #define INF 0x7fffffff using namespace std; //input int map[MAX_SIZE][MAX_SIZE]; int m, n; //process bool visit[MAX_SIZE][MAX_SIZE]; int max_value; int dx[4] = { 1, 0, 0, -1 }; int dy[4] = { 0, 1, -1, 0 }; vector<pair<int, int> > virus; void input() { scanf("%d %d", &m, &n); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%d", &map[i][j]); if(map[i][j] == 2) virus.push_back(make_pair(i, j)); } } } void copy_map(int (*a)[MAX_SIZE], int (*b)[MAX_SIZE]) { for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { a[i][j] = b[i][j]; } } } int recovery(int (*a)[MAX_SIZE], int (*b)[MAX_SIZE]) { int ret = 0; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(a[i][j] == 0) ret++; a[i][j] = b[i][j]; } } return ret; } void bfs() { queue<pair<int, int> > q; for(int i = 0; i < virus.size(); i++) q.push(virus[i]); while(!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop(); for(int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if(nx < 0 || ny < 0 || nx >= m || ny >= n || map[nx][ny] != 0) continue; map[nx][ny] = 2; q.push(make_pair(nx, ny)); } } } void dfs(int x, int y, int d) { map[x][y] = 1; visit[x][y] = 1; if(d == 3) { //bfs int tmp[MAX_SIZE][MAX_SIZE]; copy_map(tmp, map); bfs(); max_value = max(max_value, recovery(map, tmp)); visit[x][y] = 0; map[x][y] = 0; return; } for(int i = x; i < m; i++) { for(int j = 0; j < n; j++) { if(visit[i][j] || map[i][j] != 0) continue; dfs(i, j, d + 1); } } map[x][y] = 0; visit[x][y] = 0; } void process() { for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(map[i][j] != 0) continue; dfs(i, j, 1); } } printf("%d\n", max_value); } int main() { input(); process(); return 0; } | cs |
'알고리즘 > 탐색' 카테고리의 다른 글
[2146] 다리 만들기 (2) | 2017.05.23 |
---|---|
[14503] 로봇 청소기 (2) | 2017.04.18 |
[14501] 퇴사 (4) | 2017.04.17 |
[14500] 테트로미노 (0) | 2017.04.17 |
[3055] 탈출 (0) | 2017.04.16 |