어흥

[백준 14502] 연구소 (C++) 본문

알고리즘/백준

[백준 14502] 연구소 (C++)

라이언납시오 2020. 3. 6. 14:54
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/14502

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크기가 N×M인 직사각형으로 나타낼 수 있으며, 직사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는 빈 칸, 벽으로 이루어져 있으며, 벽은 칸 하나를 가득 차지한다.  일부 칸은 바이러스가 존재하며, 이 바이러스는 상하좌우로 인접한 빈 칸으로 모두 퍼져나갈 수 있다.

www.acmicpc.net

1. 주의할 점

- 벽을 세웠다고 가정 -> 계산 -> 추가로 세웠던 벽을 허물어야한다

 

2. 구현

- DFS를 통해 벽을 세울 3가지 좌표를 구한다

- 이후, BFS를 통해 바이러스를 퍼트리고 안전지대의 크기를 구한다.

 

#include <iostream>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
int row, col, result = 0;
int arr[8][8];
int dup[8][8];

struct info {
	int x, y;
};
info tmp;
queue<info> virus;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };

void bfs() {
	queue <info> q;
	q = virus;
	memcpy(dup, arr, sizeof(dup));
	while (!q.empty()) {
		int cx = q.front().x;
		int cy = q.front().y;
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nx = cx + dx[i];
			int ny = cy + dy[i];
			if (nx >= 0 && ny >= 0 && nx < col && ny < row && dup[ny][nx]==0) {
				dup[ny][nx] = 2;
				tmp.x = nx;
				tmp.y = ny;
				q.push(tmp);
			}
		}
	}
	int t_result = 0;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			if (dup[i][j] == 0)
				t_result++;
	result = max(result, t_result);
}

void dfs(int y, int x, int cnt) {
	if (cnt == 3) {
		bfs();
		return;
	}
	if (x == col) {
		x = 0;
		y += 1;
	}
	if (y == row) return;
	if (arr[y][x] == 0) {
		arr[y][x] = 1;
		dfs(y, x + 1, cnt + 1);
		arr[y][x] = 0;
	}
	dfs(y, x + 1, cnt);
}

int main() {
	cin >> row >> col;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++) {
			cin >> arr[i][j];
			if (arr[i][j] == 2) {
				tmp.x = j;
				tmp.y = i;
				virus.push(tmp);
			}
		}
	dfs(0, 0, 0);
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형

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

[백준 8978] 올림픽 (C++)  (0) 2020.03.06
[백준 9205] 맥주 마시면서 걸어가기 (C++)  (0) 2020.03.06
[백준 5214] 환승 (C++)  (0) 2020.03.06
[백준 4179] 불! (C++)  (0) 2020.03.05
[백준 10711] 모래성 (C++)  (0) 2020.03.05
Comments