문제 링크: https://www.acmicpc.net/problem/14502
브루트포스 문제입니다.
벽을 3군데에 세우는 모든 경우의 수에 대해서 바이러스를 퍼트린 후 칸을 세봐서 가장 많은 칸이 남은 경우의 칸 수를 구하면 됩니다.
연구실이 전부 빈 칸이라고 가정했을 때 벽을 3군데에 세우는 모든 경우의 수는 \(\displaystyle\frac{64!}{61!\times3!} = \frac{64 \times 63 \times 62}{6} = 41664\)가 되니까 적당히 다 돌려볼 수 있습니다.
바이러스를 퍼트리는 건 dfs, bfs중에 골라서 해주면 됩니다
#include <bits/stdc++.h>
using namespace std;
enum cell { empty, wall, virus };
const int dy[] = { -1, 0, 1, 0 };
const int dx[] = { 0, 1, 0, -1 };
int n, m;
int board[8][8];
vector<pair<int, int>> virus_pt;
int max_area;
constexpr bool in_range(int y, int x) {
return y>=0 && y<n && x>=0 && x<m;
}
void bruteforce(int current, vector<int>& picked, int toPick) {
if (toPick == 0) {
int copied[8][8];
memcpy(copied, board, sizeof(board));
for (auto& idx : picked) {
int row = idx / m;
int col = idx % m;
copied[row][col] = cell::wall;
}
queue<pair<int, int>> q;
for (auto& p : virus_pt)
q.push(p);
while (!q.empty()) {
auto [y, x] = q.front();
q.pop();
for (int i = 0; i < 4; ++i) {
int ny = y + dy[i];
int nx = x + dx[i];
if (in_range(ny, nx) && copied[ny][nx] == cell::empty) {
copied[ny][nx] = cell::virus;
q.emplace(ny, nx);
}
}
}
int cnt = 0;
for (int i=0; i<n; ++i)
for (int j=0; j<m; ++j)
if (copied[i][j] == cell::empty)
++cnt;
max_area = max(max_area, cnt);
return;
}
if (current == n * m)
return;
int row = current / m;
int col = current % m;
if (board[row][col] == cell::empty) {
picked.push_back(current);
bruteforce(current + 1, picked, toPick - 1);
picked.pop_back();
}
bruteforce(current + 1, picked, toPick);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) {
cin >> board[i][j];
if (board[i][j] == cell::virus)
virus_pt.emplace_back(i, j);
}
vector<int> v;
bruteforce(0, v, 3);
cout << max_area;
return 0;
}
벽을 세울 칸을 고르는건 백트래킹으로 했고, 바이러스는 bfs로 퍼트렸습니다.
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 11779: 최소비용 구하기 2 (0) | 2020.08.02 |
---|---|
[백준][C++] 1411: 비슷한 단어 (0) | 2020.08.01 |
[백준][C++] 1662: 압축 (0) | 2020.08.01 |
[백준][C++] 5719: 거의 최단 경로 (0) | 2020.08.01 |
[백준][C++] 3182: 한동이는 공부가 하기 싫어! (0) | 2020.07.31 |