티스토리 뷰
삼성 SW 역량테스트에 나온 문제다
비트를 통해 완전탐색을 하면 답을 구할 수 있다
치킨집과 집을 미리 vt에 따로 담아두고
for문을 돌리며 bit가 m개 체크된다면
지금 체크된 치킨집과 집들과의 최소거리를 다 구해보면 된다!
소스코드
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 | #include <iostream> #include <algorithm> #include <vector> #include <cmath> using namespace std; int map[55][55], n, m,ccnt; vector<pair<int, int>> chi, home; int dist(int x1, int y1, int x2, int y2) { return abs(x1 - x2) + abs(y1 - y2); } int go(int x) { vector<pair<int, int>> vt; for (int j = 0; j < ccnt; j++) { if (x&(1 << j)) vt.push_back(chi[j]); } int ret = 0; for (int i = 0; i < home.size(); i++) { int d = 1e9; for (int j = 0; j < vt.size(); j++) { d = min(d, dist(home[i].first, home[i].second, vt[j].first, vt[j].second)); } ret += d; } return ret; } int main() { scanf(" %d %d", &n, &m); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf(" %d", &map[i][j]); if (map[i][j] == 1) home.push_back({ i,j }); else if (map[i][j] == 2) chi.push_back({ i,j }); } } ccnt = chi.size(); int ans = 1e9; for (int i = 0; i < (1 << ccnt); i++) { int cnt = 0; for (int j = 0; j < ccnt; j++) { if (i&(1 << j)) cnt++; } if (cnt == m) { ans = min(ans, go(i)); } } printf("%d\n", ans); return 0; } | cs |
'알고리즘 > BOJ' 카테고리의 다른 글
[백준] 15782 Calculate! 2 (0) | 2018.07.09 |
---|---|
[백준] 11963 High Card Low Card (Gold) (0) | 2018.07.06 |
[백준] 6603 로또 (0) | 2018.07.05 |
[백준] 13701 중복 제거 (1) | 2018.07.05 |
[백준] 11723 집합 (2) | 2018.07.05 |
댓글