개발일지/알고리즘

백준 15686번 : 치킨 배달

김진우 개발일지 2025. 2. 2. 18:36
#include <iostream>
#include <vector>
#include <cmath>
#include <climits>
#include <algorithm>
using namespace std;

int getChickenDistance(const vector<pair<int, int>>& houses, const vector<pair<int, int>>& selectedChicken) {
    int totalDistance = 0;

    for (const auto& house : houses) {
        int minDistance = INT_MAX;
        for (const auto& shop : selectedChicken) {
            minDistance = min(minDistance, abs(house.first - shop.first) + abs(house.second - shop.second));
        }
        totalDistance += minDistance;
    }
    return totalDistance;
}

void selectChicken(int N, int M, int index, const vector<pair<int, int>>& chicken, vector<pair<int, int>>& selectedChicken, const vector<pair<int, int>>& houses, int& result) {
    if (selectedChicken.size() == M) {
        result = min(result, getChickenDistance(houses, selectedChicken));
        return;
    }

    for (int i = index; i < chicken.size(); i++) {
        selectedChicken.push_back(chicken[i]);
        selectChicken(N, M, i + 1, chicken, selectedChicken, houses, result);
        selectedChicken.pop_back();
    }
}

int main() {
    int N, M;
    cin >> N >> M;

    vector<pair<int, int>> houses, chicken;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            int value;
            cin >> value;
            if (value == 1) {
                houses.push_back({i, j});
            } else if (value == 2) {
                chicken.push_back({i, j});
            }
        }
    }

    int result = INT_MAX;
    vector<pair<int, int>> selectedChicken;
    selectChicken(N, M, 0, chicken, selectedChicken, houses, result);
    cout << result << endl;

    return 0;
}

'개발일지 > 알고리즘' 카테고리의 다른 글

백준 2580번 : 스도쿠  (0) 2025.02.02
백준 2661번 : 좋은수열  (1) 2025.02.02
백준 14889번 : 스타트와 링크  (0) 2025.02.02
백준 1929번 : 소수 구하기  (0) 2025.02.02
백준 1978번 : 소수 찾기  (0) 2025.02.02