(cpp) Baekjoon 14502번 문제 ‘연구소’ - 구현, 그래프이론, 브루트포스, 그래프탐색, 너비우선탐색

Baekjoon 14502번 문제 ‘연구소’ - 구현, 그래프이론, 브루트포스, 그래프탐색, 너비우선탐색


문제

예제입력2에 대한 문제풀이

image 1. 벽 3개를 세우는 경우는 브루트포스로 경우의 수를 모두 고려해야 한다.

2. 벽을 세울 때마다 감염 시뮬레이션 실행한다.

3. 감염된 상태에서 안전영역 구한다. 이 때 map의 0갯수 구하면 됨.

4. 매 case별로 안전영역 크기 구하고 최대값으로 계속해서 갱신한다.

image
image

코드

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

int n, m, map[10][10], map_origin[10][10];
int r_pos[4] = { 1,-1,0,0 };
int c_pos[4] = { 0,0,1,-1 };
int virus[64][2];


void dfs(int p, int q) {
	for (int i = 0; i < 4; i++) {
		int next_p = p + r_pos[i];
		int next_q = q + c_pos[i];
		if (next_p > 0 && next_p <= n && next_q > 0 && next_q <= m && map[next_p][next_q] == 0) {
			map[next_p][next_q] = 2;
			dfs(next_p, next_q);
		}
	}
	return;
}


int main() {
	cin >> n >> m;
	int ans = 0;
	int num = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> map[i][j];
			map_origin[i][j] = map[i][j];
			if (map[i][j] == 2) {
				virus[num][0] = i;
				virus[num][1] = j;
				num++;
			}
		}
	}



	int n1, m1, n2, m2, n3, m3;
	for (int i = 0; i < n * m; i++) {
		n1 = (i / m) + 1;
		m1 = (i % m) +1;

		if (map[n1][m1] == 0)
		{
			for (int j = i + 1; j < n * m; j++) {
				n2 = (j / m) + 1;
				m2 = (j % m) + 1;
				if (map[n2][m2] == 0)
				{
					for (int k = j + 1; k < n * m; k++) {
						n3 = (k / m) + 1;
						m3 = (k % m) + 1;
						if (map[n3][m3] == 0) {
							map[n1][m1] = 1;
							map[n2][m2] = 1;
							map[n3][m3] = 1;

							//벽 세운 후 감염시키기
							for (int p = 0; p <num; p++) {
								dfs(virus[p][0], virus[p][1]);
							}

							//감염 후 map에서 0갯수 세기
							int cnt = 0;
							for (int r = 1; r <= n; r++) {
								for (int c = 1; c <= m; c++) {
									if (map[r][c] == 0) {
										cnt++;
									}
								}
							}
							if (ans < cnt) {
								ans = cnt;
							}

							for (int u = 1; u <= n; u++) {
								for (int v = 1; v <= m; v++) {
									map[u][v] = map_origin[u][v];
								}
							}
						}
					}
				}
			}
		}
	}
	printf("%d", ans);
	return 0;
}
  • 문제를 오히려 너무 어렵게 생각했었다. 시뮬레이션 map생성해야 함.
  • 안전영역의 정의를 연속된 0의 범위가 최대인 것으로 잘못 생각했다. 단지 map전체에서의 0의 갯수만 구하면 됨.
  • 벽 3개를 세우는 경우의 수를 삼중 for문으로 구현하는 idea와 이 때, index를 (행,열) 형태로 전환하는 것이 어려웠다.