[BOJ] 꽃길
Date:
[BOJ] 꽃길
Problem URL : 꽃길
#include<iostream>
using namespace std;
int n;
int cost[10][10];
bool chk[10][10];
int ans;
bool seedable(int x, int y) {
// 순차적으로 심으므로 (dfs를 돌게 되므로)
// 이전 좌표만 체크해주면 된다.
return !chk[x - 1][y] && !chk[x][y - 1];
}
void seed(int x, int y, bool mode) {
chk[x][y] = mode;
chk[x + 1][y] = mode;
chk[x - 1][y] = mode;
chk[x][y + 1] = mode;
chk[x][y - 1] = mode;
}
void calc() {
int sum = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (chk[i][j]) {
sum += cost[i][j];
}
}
}
if (ans > sum) {
ans = sum;
}
}
void dfs(int cnt, int x, int y) {
if (cnt == 3) {
calc();
return;
}
for (int j = y + 1; j < n - 1; j++) {
if (seedable(x, j)) {
seed(x, j, true);
dfs(cnt + 1, x, j);
seed(x, j, false);
}
}
for (int i = x + 1; i < n - 1; i++) {
for (int j = 1; j < n - 1; j++) {
if (seedable(i, j)) {
seed(i, j, true);
dfs(cnt + 1, i, j);
seed(i, j, false);
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> cost[i][j];
}
}
ans = 1e9;
// 가장 바깥 부분 ( i = 0 또는 j =0) 에는 심을 수 없다.
for (int i = 1; i < n - 1; i++) {
for (int j = 1; j < n - 1; j++) {
seed(i, j, true);
dfs(1, i, j);
seed(i, j, false);
}
}
cout << ans;
return 0;
}
댓글