๋ฐฑ์ค_14502_์ฐ๊ตฌ์
๐โ๏ธ ๋ฌธ์
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;
}