티스토리 뷰

알고리즘/BOJ

[BOJ 17142] 연구소 3

히더 2019. 9. 18. 18:13

백준 :: BOJ :: 17142 :: 연구소 3

 

출처 : https://www.acmicpc.net/problem/17142

 

17142번: 연구소 3

인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고, 활성 상태인 바이러스는 상하좌우로 인접한 모든 빈 칸으로 동시에 복제되며, 1초가 걸린다. 승원이는 연구소의 바이러스 M개를 활성 상태로 변경하려고 한다. 연구소는 크기가 N×N인 정사각형으로 나타낼 수 있으며, 정사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;

#define F(p,q) for(int p=0; p<q; p++)
struct S { int si, sj; };
int i, j, A[50][50], N, M, R = 1e4, c, z, r[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };

int main() {
	vector<S> v; vector<int> v3;
	cin >> N >> M;
	F(i, N) F(j, N) {
		cin >> A[i][j]; if (A[i][j] > 1) { v.push_back({ i,j }); z++; } if (!A[i][j]) c++;
	}
	F(i, z - M) v3.push_back(0); F(i, M) v3.push_back(1);
	if (!c) R = 0;
	else {
		do {
			int B[50][50], dd = c, ti = 0; memcpy(B, A, sizeof(A)); queue<S> q;
			F(i, v3.size()) { if (v3[i]) { q.push(v[i]); B[v[i].si][v[i].sj] = 3; } }
			while (!q.empty()) {
				int qs = q.size(); ti++;
				while ((qs--)) {
					S ts = q.front(); q.pop();
					F(j, 4) {
						int ni = ts.si + r[j][0], nj = ts.sj + r[j][1];
						if ((ni >= 0 && nj >= 0 && ni < N && nj < N && !(B[ni][nj] % 2))) {
							q.push({ ni,nj }); if (!B[ni][nj])dd--; B[ni][nj] = 3;
						}
					}
					if (!dd) { R = min(R, ti); break; }
				}
				if (ti >= R) break;
			}
		} while (next_permutation(v3.begin(), v3.end()));
	}
	cout << (R < 1e4 ? R : -1);
	return 0;
}

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

[BOJ 17837] 새로운 게임 2  (0) 2019.11.06
[BOJ 17779] 게리맨더링 2  (0) 2019.10.24
[BOJ 17140] 이차원 배열과 연산  (0) 2019.09.18
[BOJ 17143] 낚시왕  (0) 2019.05.14
[BOJ 17144] 미세먼지 안녕!  (2) 2019.05.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함