반갑습니다!

[백준] 15686 치킨 배달 본문

알고리즘 문제 풀이

[백준] 15686 치킨 배달

김덜덜이 2020. 5. 12. 13:40
15686번: 치킨 배달
 
www.acmicpc.net

풀이

백트래킹을 사용하면 어렵지 않게 해결할 수 있다. 선택한 치킨집의 인덱스를 저장해서 치킨거리를 계산하기 쉽도록 구현했다.

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

int n, m, ans = INT_MAX;
int map[50][50];
vector<int> cand;
vector<pair<int, int>> home, chicken;

void dfs(int idx, int cnt) {
    if (cnt == m) {
        int tmp = 0;
        for (int i = 0; i < home.size(); i++) {
            int min_dist = INT_MAX;
            for (int j = 0; j < cand.size(); j++)
                min_dist = min(min_dist, abs(home[i].first - chicken[cand[j]].first) + abs(home[i].second - chicken[cand[j]].second));
            tmp += min_dist;
            if (tmp > ans) return;
        }
        ans = min(ans, tmp);
        return;
    }

    for (int i = idx + 1; i < chicken.size(); i++) {
        cand.push_back(i);
        dfs(i, cnt + 1);
        cand.pop_back();
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            cin >> map[i][j];
            if (map[i][j] == 1) home.push_back({ j, i });
            if (map[i][j] == 2) chicken.push_back({ j, i });
        }
    dfs(-1, 0);
    cout << ans << '\n';
    return 0;
}

'알고리즘 문제 풀이' 카테고리의 다른 글

[백준] 3034 앵그리 창영  (0) 2020.05.19
[백준] 1550 16진수  (0) 2020.05.12
[백준] 15685 드래곤 커브  (0) 2020.05.11
[백준] 15683 감시  (0) 2020.05.11
[프로그래머스] 불량 사용자  (0) 2020.05.09