SDS ( -> PS)
[1일차] 알고리즘 기초 L - 15686 : 치킨 배달
왕방토
2022. 1. 9. 22:18
728x90
골드 Ⅴ
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
struct Point {
int x, y;
};
int N, M;
vector<Point> chickPoint;
vector<Point> housePoint;
vector<int> chickDiss;
int dosiMinchickDis = 10000000;
vector<int> nCm;
void backtracking(int start) {
//m개의 치킨집이 골라졌을 때
if (nCm.size() == M) {
//집들의 치킨거리 구하기
int cnt = 0;
for (auto house : housePoint) {
int minChickDis = 1000000;
//m개의 치킨 집 중 최소거리 구하기
for (auto chickIdx : nCm) {
int chickDis = 0;
chickDis += abs(chickPoint[chickIdx].x - house.x);
chickDis += abs(chickPoint[chickIdx].y - house.y);
if (chickDis < minChickDis) minChickDis = chickDis;
}
//printf("%d번째 집의 치킨거리 : %d\n", cnt, minChickDis);
cnt++;
chickDiss.push_back(minChickDis);
}
//도시의 치킨거리 구하기
int dosiChickDis = 0;
for (auto i : chickDiss) dosiChickDis += i;
//printf("도시의 치킨거리: %d\n", dosiChickDis);
chickDiss.clear();
//도시의 치킨거리 최소값 찾기
if (dosiChickDis < dosiMinchickDis) dosiMinchickDis = dosiChickDis;
return;
}
//치킨집의 개수 중에서
for (int i = start; i < chickPoint.size(); i++) {
nCm.push_back(i);
backtracking(i + 1);
nCm.pop_back();
}
}
int main() {
scanf("%d%d", &N, &M);
int tmp;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &tmp);
if (tmp == 1) {
housePoint.push_back({ i, j });
}
else if (tmp == 2) {
chickPoint.push_back({ i, j });
}
}
}
backtracking(0);
printf("%d", dosiMinchickDis);
}
조합 + 브루트포스
이게.. m개의 치킨집을 고르고?
골라진 치킨집에 대해서 집 당 치킨거리를(최소를 구해야함 치킨거리의 정의가 최소...) 구하고?
구해진 집 당 치킨거리를 모든 집에 대하여 다 더하면 도시의 치킨 거리가 되는거고
이 도시의 치킨거리 중에서 최소 값을 찾는거라
알고리즘이 어려운건 아닌데.. 자꾸 최소? 이게 최소? 여기서 최소? 엥?
하게 돼서 오래걸림