Muscardinus

연구소 3 본문

알고리즘 문제/[삼성 SW 역량 테스트 기출 문제]

연구소 3

Muscardinus 2020. 9. 4. 00:04
728x90

www.acmicpc.net/problem/17142

 

17142번: 연구소 3

인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고

www.acmicpc.net

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

int map[51][51];
int n, m;
int answer = 2147000000;

int dy[] = { 0,0,1,-1 };
int dx[] = { 1,-1,0,0 };

struct POS {
	int y, x, time;
}; // 바이러스

int pos_size;
POS pos[10];

int bfs(int pick[]) {
	int empty_cnt = 0;
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < n; x++) {
			if (map[y][x] == 0) empty_cnt++;
		}
	}
	queue<POS> q;
	int visited[51][51] = { 0, };
	for (int i = 0; i < m; i++) {
		q.push(pos[pick[i]]);
		visited[pos[pick[i]].y][pos[pick[i]].x] = 1;
	}
	while (!q.empty()) {
		POS cur = q.front(); q.pop();
		if (map[cur.y][cur.x] == 0) empty_cnt--;
		if (empty_cnt == 0) return cur.time;
		POS next;
		next.time = cur.time + 1;
		for (int dir = 0; dir < 4; dir++) {
			next.y = cur.y + dy[dir];
			next.x = cur.x + dx[dir];
			if (next.y < 0 || next.y >= n || next.x < 0 || next.x >= n) continue;
			if (visited[next.y][next.x] == 0 && map[next.y][next.x] != 1) {
				q.push(next);
				visited[next.y][next.x] = 1;
			}
		}
	}
	return 2147000000;
}

void DFS(int last_pick, int pick_cnt, int pick[]) {
	if (pick_cnt == m) {
		int candi = bfs(pick);
		answer = min(answer, candi);
	}
	else {
		for (int i = last_pick + 1; i < pos_size; i++) {
			pick[pick_cnt] = i;
			DFS(i, pick_cnt + 1, pick);
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin >> n >> m;
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < n; x++) {
			cin >> map[y][x];
			if (map[y][x] == 2) {
				pos[pos_size].y = y;
				pos[pos_size].x = x;
				pos[pos_size].time = 0;
				pos_size++;
			}
		}
	}
	int pick[10] = { 0, }; //활성 바이러스
	DFS(-1, 0, pick);
	if (answer == 2147000000) answer = -1;
	cout << answer << "\n";
	return 0;
}
728x90

'알고리즘 문제 > [삼성 SW 역량 테스트 기출 문제]' 카테고리의 다른 글

새로운 게임 2  (0) 2020.09.05
게리멘더링 2  (0) 2020.09.04
이차원 배열과 연산  (0) 2020.09.03
미세먼지 안녕!  (0) 2020.09.02
아기상어  (0) 2020.09.01
Comments