https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸
www.acmicpc.net
이 문제는 개인적으로 조합을 만들 수 있다면 그렇게 어려운 문제는 아닌거 같다.
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int n, m;
//int village[55][55];
vector<pair<int, int>> chickenHouses;
vector<pair<int, int>> houses;
vector<pair<int, int>> selectedChickenHouses;
int result = 500000;
int chickenDistance()
{
int dist = 0;
for (int i = 0; i < houses.size(); i++) {
int minDis = 500000;
for (int j = 0; j < selectedChickenHouses.size(); j++) {
int d = abs(houses[i].first - selectedChickenHouses[j].first) + abs(houses[i].second - selectedChickenHouses[j].second);
minDis = min(minDis, d);
}
dist += minDis;
}
return dist;
}
void selectChickenHouse(int s)
{
if (selectedChickenHouses.size() == m) {
for (auto i : selectedChickenHouses) {
//cout << i.first << " : " << i.second << "\n";
}
result = min(result, chickenDistance());
//cout << "result: " << result << "\n";
return;
}
for (int i = s; i < chickenHouses.size(); i++) {
selectedChickenHouses.push_back(chickenHouses[i]);
//cout << "push back y: " << chickenHouses[i].first << " x: " << chickenHouses[i].second << "\n";
selectChickenHouse(i + 1);
selectedChickenHouses.pop_back();
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int a; cin >> a;
//village[i][j] = a;
if (a == 1) houses.push_back(make_pair(i, j));
if (a == 2) chickenHouses.push_back(make_pair(i, j));
}
}
selectChickenHouse(0);
cout << result;
}
'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글
백준 2529 C++ (0) | 2024.03.06 |
---|---|
백준 4179 C++ (0) | 2024.02.20 |
백준 17298 C++ (1) | 2024.02.14 |
백준 1068 C++ (2) | 2024.02.13 |
백준 11047번 C++ (0) | 2022.09.13 |