์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€_14502_์—ฐ๊ตฌ์†Œ

shj718 2022. 6. 16. 18:08

๐Ÿ™‹‍โ™€๏ธ ๋ฌธ์ œ

https://www.acmicpc.net/problem/14502

 

14502๋ฒˆ: ์—ฐ๊ตฌ์†Œ

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ํฌ

www.acmicpc.net

 

๐Ÿงฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฌธ์ œ๋Š” 2๊ฐœ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ

1) ๋ฒฝ์„ 3๊ฐœ ์„ธ์šฐ๊ธฐ

→ ๋ฒฝ์„ ์–ด๋–ป๊ฒŒ ์„ธ์›Œ์•ผ ์•ˆ์ „์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค ํ•ด๋ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ธŒ๋ฃจํŠธํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ

์‹œ๊ฐ„๋ณต์žก๋„: O((N * M)^3)

 

2) ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์งˆ ์ˆ˜ ์—†๋Š” ๊ณณ์˜ ํฌ๊ธฐ ๊ตฌํ•˜๊ธฐ

→ ํ•œ ์ •์ ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ชจ๋“  ์ •์  ๋ฐฉ๋ฌธ = DFS / BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ

์‹œ๊ฐ„๋ณต์žก๋„: O(N * M)

 

⇒ ์ด ์‹œ๊ฐ„๋ณต์žก๋„: O((N * M)^4)

 

๐Ÿ’ก ์•„์ด๋””์–ด

โœ๏ธ Part 1 (๋ฒฝ 3๊ฐœ ์„ธ์šฐ๊ธฐ) ํ’€์ด

-๋ธŒ๋ฃจํŠธํฌ์Šค ๊ตฌํ˜„ ๋ฐฉ๋ฒ•: ์žฌ๊ท€ or 3์ค‘ for๋ฌธ

→ ๊ณจ๋ผ์•ผํ•˜๋Š” ๊ฐœ์ˆ˜๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ for๋ฌธ๋„ ๋‚˜์˜์ง€ ์•Š์Œ

 

โœ๏ธ Part 2 (์•ˆ์ „์˜์—ญ ํฌ๊ธฐ ๊ตฌํ•˜๊ธฐ) ํ’€์ด

-๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ์นธ์„ ๋Œ€์ƒ์œผ๋กœ DFS / BFS ์ง„ํ–‰

→ ์•ˆ์ „์˜์—ญ์˜ ํฌ๊ธฐ: ์ „์ฒด ์นธ์˜ ๊ฐœ์ˆ˜(N * M) - ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ์นธ์˜ ๊ฐœ์ˆ˜

 

๐Ÿ‘ฉ‍๐Ÿ’ป ์ฝ”๋“œ

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

using namespace std;

int n, m;
int arr[8][8];
int tmp[8][8];
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
int ans;

int bfs() {
	queue<pair<int, int>> q;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			tmp[i][j] = arr[i][j];
			if (arr[i][j] == 2) { // ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์นธ์ด ์‹œ์ž‘์ ์ž„
				q.push(make_pair(i, j));
			}
		}
	}
	while (!q.empty()) { // ๋ฐ”์ด๋Ÿฌ์Šค ํผ๋œจ๋ฆฌ๋ฉด์„œ bfs ์ง„ํ–‰
		pair<int, int> x = q.front(); q.pop();
		for (int i = 0; i < 4; i++) {
			int nx = x.first + dx[i];
			int ny = x.second + dy[i];
			if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
			if (tmp[nx][ny] == 0) {
				tmp[nx][ny] = 2;
				q.push(make_pair(nx, ny));
			}
		}
	}
	int safe_cnt = 0;
	for (int i = 0; i < n; i++) { // ์•ˆ์ „์˜์—ญ์˜ ํฌ๊ธฐ ๊ตฌํ•˜๊ธฐ
		for (int j = 0; j < m; j++) {
			if (tmp[i][j] == 0)
				safe_cnt++;
		}
	}
	return safe_cnt;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> arr[i][j];
		}
	}
	for (int x1 = 0; x1 < n; x1++) {
		for (int y1 = 0; y1 < m; y1++) {
			if (arr[x1][y1] != 0) continue;
			for (int x2 = 0; x2 < n; x2++) {
				for (int y2 = 0; y2 < m; y2++) {
					if (arr[x2][y2] != 0) continue;
					for (int x3 = 0; x3 < n; x3++) {
						for (int y3 = 0; y3 < m; y3++) {
							if (arr[x3][y3] != 0) continue;
							if (x1 == x2 && y1 == y2) continue;
							if (x2 == x3 && y2 == y3) continue;
							if (x3 == x1 && y3 == y1) continue;
							// ๋ฒฝ 3๊ฐœ ์„ธ์šฐ๊ธฐ
							arr[x1][y1] = 1;
							arr[x2][y2] = 1;
							arr[x3][y3] = 1;
							// ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ๊ณณ ํƒ์ƒ‰
							int cur = bfs();
							if (ans < cur) ans = cur;
							// ๋ฒฝ ์›์ƒ๋ณต๊ตฌ ์‹œํ‚ค๊ธฐ
							arr[x1][y1] = 0;
							arr[x2][y2] = 0;
							arr[x3][y3] = 0;
						}
					}
				}
			}
		}
	}
	cout << ans << '\n';
	return 0;
}