백준알고리즘
연구소
먼지의삶
2019. 7. 17. 02:23
#include<cstdio>
#include<vector>
#include<queue>
#include<utility>
#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
int a[9][9];
vector<pair<int, int>> v1;
vector<pair<int, int>> v2;
vector<pair<int, int>> v3;
int d[9][9];
bool f[9][9];
int dx[] = {0,0,-1,1};
int dy[] = {1,-1,0,0};
void re(){
for(int i = 0; i < v1.size(); i++){
int x = v1[i].first;
int y = v1[i].second;
d[x][y] = 0;
}
for(int i = 0; i < v2.size(); i++){
int x = v2[i].first;
int y = v2[i].second;
d[x][y] = 2;
}
for(int i = 0; i < v3.size(); i++){
int x = v3[i].first;
int y = v3[i].second;
d[x][y] = 1;
}
for(int i = 0; i < 9; i ++){
for(int j =0; j < 9; j++)
f[i][j] = false;
}
}
void bfs(int x, int y){
queue<pair<int, int>> q;
q.push(make_pair(x, y));
d[x][y] = 2;
f[x][y] = true;
while(!q.empty()){
x = q.front().first; 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 (f[nx][ny] == false) {
if (d[nx][ny] == 0) {
f[nx][ny] = true;
d[nx][ny] = 2;
q.push(make_pair(nx, ny));
}
}
}
}
}
}
int main(){
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++){
for(int j = 0; j < m;j++){
scanf("%d", &a[i][j]);
if(a[i][j] == 0) v1.push_back(make_pair(i,j));
if(a[i][j] == 2) v2.push_back(make_pair(i,j));
if(a[i][j] == 1) v3.push_back(make_pair(i,j));
}
}
re();
vector<int> s;
for(int i = 0; i< v1.size() - 3; i++){
s.push_back(0);
}
s.push_back(1);
s.push_back(1);
s.push_back(1);
int result = 0;
vector<int> qq;
do{
int zero = 0;
vector<pair<int, int>> il;
for(int i = 0; i < s.size(); i++){
if(s[i] == 1){
int x = v1[i].first;
int y = v1[i].second;
il.push_back(make_pair(x,y));
}
}
for(int i = 0; i < il.size(); i++){
d[il[i].first][il[i].second] = 1;
}
for(int i = 0; i < v2.size(); i++){
bfs(v2[i].first, v2[i].second);
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(d[i][j] == 0)
zero +=1;
}
}
if(zero > result)
result = zero;
qq.push_back(zero);
re();
}while(next_permutation(s.begin(), s.end()));
//for(int i = 0; i < qq.size(); i++)
// printf("%d", qq[i]);
//printf("\n");
printf("%d\n", result);
return 0;
}
BFS로만 하다가, 배열크기가 최대 8,8이길래 브루트포스 곁들여서 진행함
permutation 돌려서, 0의 위치 를 세개 계속 1로바꿔주고 진행해봄