https://www.acmicpc.net/problem/14620
꽃의 중심 사이의 거리를 계산해서 꽃이 겹치지 않도록 해야 한다.
두 꽃을 겹치지 않게 놓으려면 (행의 차)+(열의 차) < 3 이어야 한다.
그런데 꽃을 세 개 놓아야 하므로 세 꽃 사이의 거리를 모두 계산해야 한다.
#include <iostream>
#include <vector>
using namespace std;
int oneFlower(vector<vector<int>> p, int r, int c) {
return p[r-1][c] + p[r][c-1] + p[r][c] + p[r][c+1] + p[r+1][c];
}
int solution(vector<vector<int>> p) {
int ans = 200*10*10;
int n = p.size();
for(int i=1; i<n-1; i++){
for(int j=1; j<n-1; j++){
for(int a=1; a<n-1; a++){
for(int b=1; b<n-1; b++){
if(abs(i-a) + abs(j-b) < 3) continue;
for(int x=1; x<n-1; x++){
for(int y=1; y<n-1; y++){
if(abs(x-a) + abs(y-b) < 3 || abs(x-i) + abs(y-j) < 3) continue;
ans = min(ans, oneFlower(p, i, j) + oneFlower(p, a, b) + oneFlower(p, x, y));
}
}
}
}
}
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<vector<int>> price(n, vector<int>(n,0));
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cin >> price[i][j];
}
}
cout << solution(price);
return 0;
}