-
Notifications
You must be signed in to change notification settings - Fork 846
/
Copy path7.cpp
62 lines (53 loc) · 1.76 KB
/
7.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <bits/stdc++.h>
using namespace std;
int n, m;
int arr[50][50];
vector<pair<int, int> > chicken;
vector<pair<int, int> > house;
// 치킨 거리의 합을 계산하는 함수
int getSum(vector<pair<int, int> > candidates) {
int result = 0;
// 모든 집에 대하여
for (int i = 0; i < house.size(); i++) {
int hx = house[i].first;
int hy = house[i].second;
// 가장 가까운 치킨 집을 찾기
int temp = 1e9;
for (int j = 0; j < candidates.size(); j++) {
int cx = candidates[j].first;
int cy = candidates[j].second;
temp = min(temp, abs(hx - cx) + abs(hy - cy));
}
// 가장 가까운 치킨 집까지의 거리를 더하기
result += temp;
}
// 치킨 거리의 합 반환
return result;
}
int main(void) {
cin >> n >> m;
for (int r = 0; r < n; r++) {
for (int c = 0; c < n; c++) {
cin >> arr[r][c];
if (arr[r][c] == 1) house.push_back({r, c}); // 일반 집
else if (arr[r][c] == 2) chicken.push_back({r, c}); // 치킨집
}
}
// 모든 치킨 집 중에서 m개의 치킨 집을 뽑는 조합 계산
vector<bool> binary(chicken.size());
fill(binary.end() - m, binary.end(), true);
// 치킨 거리의 합의 최소를 찾아 출력
int result = 1e9;
do {
vector<pair<int, int> > now;
for (int i = 0; i < chicken.size(); i++) {
if (binary[i]) {
int cx = chicken[i].first;
int cy = chicken[i].second;
now.push_back({cx, cy});
}
}
result = min(result, getSum(now));
} while(next_permutation(binary.begin(), binary.end()));
cout << result << '\n';
}