Algorithm/C++
[백준 BoJ] 17141 - 연구소 2
cgy12306
2021. 11. 21. 17:28
// https://www.acmicpc.net/problem/17141
// 연구소 2
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int N, map[51][51], tmap[51][51], M, res = 99999999, Max = 0;
bool visited[51][51], vmap[51][51];
int dx[] = {-1, 1 ,0 ,0};
int dy[] = {0, 0, -1, 1};
queue<pair<int, int>> que;
vector<pair<int, int>> virus;
vector<int> check;
void bfs(int x, int y) {
while (!que.empty()) {
x = que.front().first;
y = que.front().second;
que.pop();
vmap[x][y] = true;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
if (tmap[nx][ny] != 0 || vmap[nx][ny]) continue;
tmap[nx][ny] = tmap[x][y] + 1;
que.push(make_pair(nx, ny));
}
}
}
void brute_force() {
do {
memcpy(tmap, map, sizeof(map));
memcpy(vmap, visited, sizeof(visited));
for (int i = 0; i < check.size(); i++) {
if (check[i]) {
tmap[virus[i].first][virus[i].second] = 1;
vmap[virus[i].first][virus[i].second] = true;
}
else {
tmap[virus[i].first][virus[i].second] = 0;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (tmap[i][j] == 1 && vmap[i][j]) {
que.push(make_pair(i, j));
}
}
}
bfs(que.front().first, que.front().second);
Max = 0;
bool flag = false;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
Max = max(Max, tmap[i][j]);
if (tmap[i][j] == 0) flag = true;
}
}
Max -= 1;
if (flag) continue;
res = min(Max, res);
} while (next_permutation(check.begin(), check.end()));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
if (map[i][j] == 1) map[i][j] = -1;
if (map[i][j] == 2) {
virus.push_back(make_pair(i, j));
check.push_back(0);
}
}
}
for (int i = 0; i < M; i++) check[i] = 1;
sort(check.begin(), check.end());
brute_force();
if (res == 99999999) {
cout << -1;
}
else {
cout << res;
}
}