공부혜옹

백준 15686 치킨배달 본문

공부합시다/Algorithm

백준 15686 치킨배달

Blair06 2021. 8. 31. 18:56

어떻게 하면 효율적으로 풀 수 있을까 치킨집 주위로 가까운집이 몇갠지 세서 통계내야하나 별 생각을 다하다가 결국 dfs를 이용해 완전탐색하기로 했다.

 

치킨집 조합을 모두 구해서 각 조합별 도시의 최소치킨거리를 구해 가장 작은 치킨거리를 보유한 조합을 선택한다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

int n,m ;
int arr[51][51];
bool check[14];
int ans = 987654321;
vector<pair<int, int>> chicken;
vector<pair<int, int>> home;

int calc(pair<int,int> a, pair<int,int> b){
    return abs(a.first-b.first) + abs(a.second-b.second);
}

void DFS(int idx, int selected){

    
    if (selected == m) {
         int sum = 0;

         for (int i = 0; i < home.size(); i++){
             int dist = 987654321;
             for (int j = 0; j < chicken.size(); j++){

                 if (check[j]){
                     dist = min(dist, calc(home[i], chicken[j]));
                 }
             }
             sum += dist;

         }

         ans = min(ans, sum);

         return;

    }
    if (idx == chicken.size()){
        return;
    }
    check[idx] = true;
    DFS(idx + 1, selected + 1);
    check[idx] = false;
    DFS(idx + 1, selected);

}





int main(void) {
    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 >> arr[i][j];
            if(arr[i][j] == 1){
                home.push_back(make_pair(i, j));
            } else if(arr[i][j] == 2){
                chicken.push_back(make_pair(i, j));
            }
        }
    }
    
    
    DFS(0,0);
    cout <<ans;
    
    return 0;
}
반응형

'공부합시다 > Algorithm' 카테고리의 다른 글

백준 1485 정사각형  (0) 2021.09.14
백준 1004 어린 왕자  (0) 2021.09.14
백준 1339 단어수학  (0) 2021.08.31
백준 1915 가장 큰 정사각형  (0) 2021.08.17
백준 2133 타일 채우기  (0) 2021.08.16
Comments