코딩테스트 준비
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