문제를 풀 때, 완전 탐색 방법으로 설계 => 시간복잡도 계산 => 만약 가능하다면 완탐으로 구현!
ret = min(ret, sum);코드를 통해, 모든 치킨집에 대해서 최소의 도시의 치킨 거리를 찾기 위해 갱신#include <bits/stdc++.h>
using namespace std;
int N, M, tmp;
// 최솟값을 고르므로
int ret = 1e6;
// N x N matrix만들지 말고 치킨집, 집 좌표만 저장
vector<pair<int, int>> chicken;
vector<pair<int, int>> tmp_chicken;
vector<pair<int, int>> house;
// 맨하탄 거리 계산 함수
int calc_distance(pair<int, int>h, pair<int, int> c) {
return abs(h.first - c.first) + abs(h.second - c.second);
}
// 치킨집의 한 조합이 선택되었을 때, 해당 치킨집에서 구할 수 있는 도시의 치킨 거리 계산 및 최솟값 갱신하는 함수
void go(){
vector<int> tmp_house_dist;
for(auto it_h: house){
int min_dist = 1e6;
for(auto it_c: tmp_chicken) {
min_dist = min(min_dist, calc_distance(it_h, it_c));
}
// 각 집마다 가장 거리가 짧은 치킨집의 거리를 더함
tmp_house_dist.push_back(min_dist);
}
// 도시의 치킨 거리 계산
int sum = accumulate(tmp_house_dist.begin(), tmp_house_dist.end(), 0);
ret = min(ret, sum);
}
// M개의 치킨 선택 => 해당 치킨 조합 선택 후 go() 호출
void chooseChicken(int idx, int cnt){
if(cnt == M) {
go();
return;
}
for(int i = idx; i < chicken.size(); i++){
tmp_chicken.push_back(chicken[i]);
chooseChicken(i+1, cnt+1);
tmp_chicken.pop_back();
}
}
int main(){
cin >> N >> M;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
cin >> tmp;
if(tmp == 1) house.push_back({i, j});
if(tmp == 2) chicken.push_back({i, j});
}
}
chooseChicken(0, 0);
cout << ret;
}
v를 인자로 넣어서, m개가 맞다면, 모든 조합 경우의 수를 보관하는chickenList에 pushvoid combi(int start, vector<int> v){
if(v.size() == m){
chickenList.push_back(v);
return;
}
for(int i = start + 1; i < chicken.size(); i++){
v.push_back(i);
combi(i, v);
v.pop_back();
}
return;
}
vector<int> v;
combi(-1, v);