๋ฌธ์
์ฝ๋
#include <iostream>
#include <queue>
#include <memory.h>
using namespace std;
int N, M, ans; //N=์ธ๋กํฌ๊ธฐ, M=๊ฐ๋กํฌ๊ธฐ, ans=์์ ์์ญ์ ํฌ๊ธฐ
int map[9][9];
int cpy[9][9];
int virus[9][9];
int dx[] = { -1,1,0,0 }; //๋ ์ ๋จ ๋ถ
int dy[] = { 0,0,1,-1 };
queue<pair<int, int>>q;
void bfs() {
memcpy(virus, cpy, sizeof(cpy)); //cpy๋ก ๋ฐ์ด๋ฌ์ค๋ฅผ ํผํธ๋ฆฌ๋ฉด ๋ค์ ๋ฒฝ์กฐํฉ์ ์ธ์ธ๋ ์ด๊ธฐํ๊ฐ ์๋๋ ๋ค๋ฅธ ๋ฐฐ์ด์ ๋ณต์ฌ.
for (int i = 0; i < N; i++) { //ํ์ฌ ์ฐ๊ตฌ์ค์ ์๋ ๋ฐ์ด๋ฌ์ค์ ์์น๋ฅผ ํ์ํ๋ค
for (int k = 0; k < M; k++) {
if (virus[i][k] == 2) q.push({ i,k });
}
}
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) { //๋์๋จ๋ถ ํ์
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < M) { //์ฐ๊ตฌ์ค์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์์๋
if (virus[nx][ny] == 0) { //๋น์นธ์ด๋ฉด
virus[nx][ny] = 2; //๊ทธ ๋ถ๋ถ์ ๋ฐ์ด๋ฌ์ค๋ก ํผ์ง๋ค
q.push({ nx,ny });
}
}
}
}
int ans_check = 0;
for (int i = 0; i < N; i++) { //์์ ์์ญ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ค.
for (int k = 0; k < M; k++) {
if (virus[i][k] == 0) ans_check++;
}
}
ans = max(ans, ans_check); //์์ ์์ญ ํฌ๊ธฐ์ ์ต๋๊ฐ ์ ์ฅ.
}
void wall(int cnt) {
if (cnt == 3) { //๋ฒฝ์ ๋ค ์ธ์ ์ผ๋ฉด bfs ํ์์ ํตํด ์์ ๊ตฌ์ญ์ ํฌ๊ธฐ๋ฅผ ์ฐพ๋๋ค.
bfs();
}
else {
for (int i = 0; i < N; i++) { //๋๋ฒ์งธ ๋ฒฝ๋ถํฐ ์ธ์ด๋ค.
for (int k = 0; k < M; k++) {
if (cpy[i][k] == 0) { //๋น์นธ์ ๋ฐ๊ฒฌํ๋ฉด
cpy[i][k] = 1; //๋ฒฝ์ ์ธ์ฐ๊ณ
wall(cnt + 1); //์ธ๋ฒ์งธ ๋ฒฝ์ ์ธ์ฐ๊ธฐ ์ํด ์ฌ๊ท๋ฅผ ํธ์ถ.
cpy[i][k] = 0; //๋๋ฒ์งธ ๋ฒฝ์ ๋ค์ ์กฐํฉ์ผ๋ก ์ธ์ด๋ค.
}
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for (int i = 0; i < N; i++) { //์ฐ๊ตฌ์ค ์ ๋ณด ์
๋ ฅ
for (int k = 0; k < M; k++) {
cin >> map[i][k];
}
}
for (int i = 0; i < N; i++) { //๋ฒฝ์ ์ธ์ฐ๋ ๋ถ๋ถ
for (int k = 0; k < M; k++) {
if (map[i][k] == 0) { //๋น์นธ์ ๋ฐ๊ฒฌํ๋ฉด
memcpy(cpy, map, sizeof(map)); //์ฐ๊ตฌ์ค ์ ๋ณด๋ฅผ ๋ณต์ฌํ๊ณ
cpy[i][k] = 1; //์ฒซ๋ฒ์งธ ๋ฒฝ์์ธ์ฐ๊ณ
wall(1); //๋๋จธ์ง ๋๊ฐ์ ๋ฒฝ์ ์ฌ๊ท๋ก ์ธ์ด๋ค.
cpy[i][k] = 0; //์ฒซ๋ฒ์งธ ๋ฒฝ์ ๋ค์ ์กฐํฉ์ผ๋ก ์์ํ๋ค.
}
}
}
cout << ans;
}
๋๊ธ