๐ฆ https://www.acmicpc.net/problem/14502
DFS(์กฐํฉ)
, BFS
๊ฐ ๋ชจ๋ ์ฐ์ด๋ ๋ฌธ์ ๋ค.
์ ๋ ฅ ๋ฐ๊ธฐ -> ๋ฐ์ผ๋ฉด์ ๋น ์นธ ์ขํ vector<pair<int,int>>์ ์ ์ฅํ๊ธฐ
๋ฒฝ 3๊ฐ ์กฐํฉ ๊ตฌํ๊ธฐ (DFS
)
makeWall(0,0)
๋ฒฝ 3๊ฐ์ ์กฐํฉ์ ๊ตฌํ๋ DFSํจ์์ด๋ค.
์ ์ฅํด๋ ๋น ์นธ ์ขํ๋ฅผ ์ด์ฉํด ์กฐํฉ์ ๊ตฌํ๋ค.
๊ตฌํ ์ขํ๋ค์ ์กฐํฉ์ ๋ฐฐ์ด์ ์ ์ฅํด๋๋ค.
3๊ฐ์ ์กฐํฉ์ ๊ตฌํ์ ๋, ๋ฐ์ด๋ฌ์ค ํผํธ๋ฆฌ๊ธฐ๋ฅผ ์คํํ๊ณ ์์ ์ง๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
๋ฐ์ด๋ฌ์ค ํผํธ๋ฆฌ๊ธฐ (BFS
)
๊ธฐ์กด ๋งต์ tmpMap์ ์นดํผํ ํ,
๊ณ ๋ฅธ 3๊ฐ์ ๋ฒฝ ์ขํ๋ฅผ ์ด์ฉํด ๊ทธ ๊ณณ์ 1๋ก ๋ง๋ค์ด์ค๋ค. (์ค์ ๋ก ๋ฒฝ ์ธ์ฐ๊ธฐ)
tmpMap์ ๋ฐ์ด๋ฌ์ค ์ขํ๋ค์ ๋ชจ๋ ํ์ ๋ฃ์ ํ
ํ๊ฐ ๋น ๋๊น์ง ๋ฐ์ด๋ฌ์ค๋ฅผ ํผํธ๋ฆฐ๋ค.
์์ ์์ญ ๊ตฌํ๊ธฐ
tmpMap==0์ธ ๊ฐ์๋ฅผ ๊ตฌํ๊ณ ,
maxVal์ ์
๋ฐ์ดํธํด์ค๋ค.
- ์ฌ๋ฌ๋ฒ ์คํ๋๋ BFS ํจ์์ด๋ฏ๋ก, visited ๋ฐฐ์ด ์ด๊ธฐํํด์ฃผ๊ธฐ. - BFS์์ ๋ฐ์ด๋ฌ์ค๋ ์ฌ๋ฌ๊ณณ์์ ๋์์ ํผ์ง๋ฏ๋ก ์ฒ์์ ๋ชจ๋ ๋ฐ์ด๋ฌ์ค ์ขํ๋ฅผ ํ์ ๋ฃ์ด์ฃผ๊ธฐ - ์กฐํฉ ๊ตฌํ ๋ startIdx for๋ฌธ ์ค์ ์กฐ์ฌ..!!!
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
int N,M;
int map[10][10];
int tmpMap[10][10];
bool visited[10][10]; //BFS ์ฉ
int dr[4]={-1,0,1,0};
int dc[4]={0,1,0,-1};
int maxVal=-1;
vector<pair<int,int>> threeWalls(3); //๊ณ ๋ฅธ 3๊ฐ์ ๋ฒฝ
vector<pair<int,int>> emptySpace;
void copyMap(){
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
tmpMap[i][j]=map[i][j];
}
}
}
//3. ์์ ์์ญ ๊ตฌํ๊ธฐ
void countSafeArea(){
int cnt=0;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(tmpMap[i][j]==0) cnt++;
}
}
maxVal=max(cnt,maxVal);
}
//2. ๋ฐ์ด๋ฌ์ค ํผํธ๋ฆฌ๊ธฐ (BFS)
void spreadVirus(){
copyMap();
//๋ฒฝ 3๊ฐ ๊ณ ๋ฅธ ๊ฑฐ ์ธ์์ฃผ๊ธฐ
for(int i=0;i<3;i++){
int r=threeWalls[i].first;
int c=threeWalls[i].second;
tmpMap[r][c]=1;
}
memset(visited,false,sizeof(visited));
queue<pair<int,int>> q;
//ํผ์ง ๋ฐ์ด๋ฌ์ค๋ค ๋ฃ์ด์ฃผ๊ธฐ.
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(tmpMap[i][j]==2){
q.push({i,j});
visited[i][j]=true;
}
}
}
//ํผํธ๋ฆฌ๊ธฐ
while(!q.empty()){
int r=q.front().first;
int c=q.front().second;
q.pop();
tmpMap[r][c]=2;
for(int d=0;d<4;d++){
int nr=r+dr[d];
int nc=c+dc[d];
if(nr<0||nr>N-1||nc<0||nc>M-1||visited[nr][nc]||tmpMap[nr][nc]!=0) continue;
q.push({nr,nc});
visited[nr][nc]=true;
}
}
}
//1. ๋ฒฝ 3๊ฐ ๊ณ ๋ฅด๊ธฐ (emptySpace์์ 3๊ฐ ๊ตฌํด์ผํจ) DFS
void makeWall(int startIdx, int L){
if(L==3) { //3๊ฐ ์กฐํฉ ๊ตฌํ ๊ฒฝ์ฐ
spreadVirus();
countSafeArea();
return;
}
// ์กฐํฉ ๊ตฌํ๊ธฐ
for(int i=startIdx;i<emptySpace.size();i++){
int r=emptySpace[i].first; //๐ฅฒ์ธ๋ฑ์ค์ startIdx ๊ทธ๋ฅ ๋ฃ๋ ์ค์๐ฅฒ
int c=emptySpace[i].second; //๐ฅฒ์ธ๋ฑ์ค์ startIdx ๊ทธ๋ฅ ๋ฃ๋ ์ค์๐ฅฒ
threeWalls[L]=make_pair(r,c); //์กฐํฉ ์ ์ฅ
makeWall(i+1, L+1); //๐ฅฒ์ธ๋ฑ์ค์ startIdx ๊ทธ๋ฅ ๋ฃ๋ ์ค์๐ฅฒ
}
}
int main() {
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
int val;
cin >> val;
map[i][j] = val;
if (val == 0) emptySpace.push_back({i, j});
}
}
//์กฐํฉ ์ฌ์ฉํด์ emptySpace์์ 3๊ฐ ๊ณจ๋ผ์ผ ํจ.
makeWall(0, 0);
cout << maxVal << "\n";
}