문제:
실수:
dfs에서 재귀함수 호출 누락
bf 탈출 조건 충족시 return!
재사용하는데 재방문을 허용하지 않는 vst -> int로 선언
코드:
전자는 빈 공간의 좌표를 1차원 배열에 저장하여
bf에서 선택지를 traverse를 할 때 1중 for문으로 처리 가능.
후자는 별도의 자료구조 없이
bf에서 map의 빈칸을 2중 for문으로 traverse
#include <iostream>
#define f(i, b, e) for(int i = (b); i < (e); ++i)
using namespace std;
int R, C;
int map[10][10];
int bl[64][2], bls;
int vr[10][2], vrs;
int vra, mvra = 64;
// dfs
int vst[9][9], v;
int dr[] = { -1, 0, 1, 0 };
int dc[] = { 0, 1, 0, -1 };
void dfs(int r, int c) {
vst[r][c] = v;
if (!map[r][c]) ++vra;
f(d, 0, 4) {
int nr = r + dr[d], nc = c + dc[d];
if (map[nr][nc] == 1) continue;
if (vst[nr][nc] == v) continue;
dfs(nr, nc);
}
}
// bf
void bf(int bli, int s) {
if (s == 3) {
++v;
vra = 0;
f(vri, 0, vrs)
dfs(vr[vri][0], vr[vri][1]);
if (vra < mvra)
mvra = vra;
return;
}
for (; bli < bls; ++bli) {
map[bl[bli][0]][bl[bli][1]] = 1;
bf(bli + 1, s + 1);
map[bl[bli][0]][bl[bli][1]] = 0;
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> R >> C;
for (int r : { 0, R + 1 })
fill(map[r], map[r] + C + 2, 1);
f(r, 1, R + 1) {
map[r][0] = map[r][C + 1] = 1;
f(c, 1, C + 1) {
cin >> map[r][c];
switch (map[r][c]) {
case 0: bl[bls][0] = r;
bl[bls][1] = c;
++bls; break;
case 2: vr[vrs][0] = r;
vr[vrs][1] = c;
++vrs; break;
}
}
}
bf(0, 0);
cout << bls - mvra - 3;
return 0;
}
#include <iostream>
#define f(i, b, e) for(int i = (b); i < (e); ++i)
using namespace std;
int R, C;
int map[10][10];
int bls;
int vr[10][2], vrs;
int vra, mvra = 64;
// dfs
int vst[9][9], v;
int dr[] = { -1, 0, 1, 0 };
int dc[] = { 0, 1, 0, -1 };
void dfs(int r, int c) {
vst[r][c] = v;
if (!map[r][c]) ++vra;
f(d, 0, 4) {
int nr = r + dr[d], nc = c + dc[d];
if (map[nr][nc] == 1) continue;
if (vst[nr][nc] == v) continue;
dfs(nr, nc);
}
}
// bf
void bf(int r, int c, int s) {
if (s == 3) {
++v;
vra = 0;
f(vri, 0, vrs)
dfs(vr[vri][0], vr[vri][1]);
if (vra < mvra)
mvra = vra;
return;
}
for(; r <= R; ++r) {
for (; c <= C; ++c) {
if (map[r][c]) continue;
map[r][c] = 1;
bf(r, c, s + 1);
map[r][c] = 0;
}
c = 0;
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> R >> C;
for (int r : { 0, R + 1 })
fill(map[r], map[r] + C + 2, 1);
f(r, 1, R + 1) {
map[r][0] = map[r][C + 1] = 1;
f(c, 1, C + 1) {
cin >> map[r][c];
switch (map[r][c]) {
case 0: ++bls; break;
case 2: vr[vrs][0] = r;
vr[vrs][1] = c;
++vrs; break;
}
}
}
bf(0, 0, 0);
cout << bls - mvra - 3;
return 0;
}