#include <iostream>
#include <vector>
#include <algorithm>
int N = 0;
int M = 0;
int iMin = 214700000;
int graph[51][51] = {};
std::vector<std::pair<int, int>> vecHouse = {};
std::vector<std::pair<int, int>> vecChicken = {};
void Min()
{
std::vector<int> vec(vecChicken.size(), 0);
for (int i = 0; i < M; ++i)
{
vec[i] = 1;
}
do
{
int iSum = 0;
for (int i = 0; i < vecHouse.size(); ++i)
{
int iCount = 100;
for (int j = 0; j < vecChicken.size(); ++j)
{
if (vec[j])
{
iCount = std::min(iCount, abs(vecChicken[j].first - vecHouse[i].first) + abs(vecChicken[j].second - vecHouse[i].second));
}
}
iSum += iCount;
}
iMin = std::min(iMin, iSum);
} while (std::prev_permutation(vec.begin(), vec.end()));
}
int main()
{
std::cin >> N >> M;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
std::cin >> graph[i][j];
if (graph[i][j] == 1)
{
vecHouse.push_back({ i,j });
}
else if (graph[i][j] == 2)
{
vecChicken.push_back({ i,j });
}
}
}
Min();
std::cout << iMin;
return 0;
}
모든 치킨집의 위치, 집의 위치를 따로 저장해놓고 치킨집의 위치를 M개 만큼만 확인해보고 계산합니다.
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 17070 파이프 옮기기 1 (0) | 2022.11.07 |
---|---|
[C++] 백준 16953 A → B (0) | 2022.11.06 |
[C++] 백준 15666 N과 M (12) (0) | 2022.11.04 |
[C++] 백준 15663 N과 M (9) (0) | 2022.11.03 |
[C++] 백준 15657 N과 M(8) (0) | 2022.11.02 |