코딩테스트 준비

15686 치킨배달 c++

김T수 2021. 10. 1. 13:24
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;

int map[51][51];
vector<pair<int, int>> house;
vector<pair<int, int>> chick;

int n, m;

int main()
{

    ios::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)
                house.push_back({i, j});
            if (map[i][j] == 2)
                chick.push_back({i, j});
        }
    }

    vector<int> rand;

   //전체 - 뽑을만큼
   //000 11 0 부터 채우삼
   //5 2      0       3 0 1 2 
    for (int i = 0; i < chick.size() - m; i++)
    {
        rand.push_back(0);
    }
    //뽑을만큼
    for(int i =0 ; i< m; i++){
        rand.push_back(1);
    }
 

    int ans = 987654321;
    do
    {
        int dist = 0; // 저장할거

        for (auto h : house)
        {
            int tmp = 987654321; // 각자비교
            for (int i = 0; i < chick.size(); i++)
            {
                if (rand[i] == 0) continue;
                //집 - 치킨
                tmp = min(tmp, abs(chick[i].first - h.first) + abs(chick[i].second - h.second));
            }
            dist += tmp;
        }
        
        ans = min(dist, ans);

    } while (next_permutation(rand.begin(), rand.end()));

    cout << ans;
    return 0;
}

https://www.youtube.com/watch?v=jZwf4OPlhtk&t=1211s