본문 바로가기

알고리즘/백준

[15686번] 치킨 배달

https://www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r과 c는 1부터 시작한다. 이 도시에 사는 사람들은 치킨을 매우 좋아한다. 따라서, 사람들은 "치킨 거리"라는 말을 주로 사용한다. 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다. 즉, 치킨 거리는

www.acmicpc.net

문제접근법

1. 치킨 집의 위치와 가정 집의 위치를 담을 자료 구조가 필요하다. 치킨 집의 위치와 가정 집의 위치를 통해서 도시의 치킨 거리를 구할 수 있기 때문이다.

 

2. 최대 M개를 뽑으라고 했으니, 조합이 필요하다. 조합을 통해서, 1 ~ M개까지 뽑은 다음에 도시의 치킨 거리를 확인해주면 된다.

 

유의사항

특별히 문제의 유의 사항이 보이지 않는다.

 

해설코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
 
int N, M;
vector<pair<intint>> h_v;
vector<pair<intint>> c_v;
int val;
int sol[13];
int answer = -1;
 
void backtracking(int cnt, int idx, int m) {
    if (cnt == m) {
        int result = 0;
        for (int i = 0; i < h_v.size(); i++) {
            int h_r = h_v.at(i).first;
            int h_c = h_v.at(i).second;
            int tmp = 51 * 51;
            for (int j = 0; j < cnt; j++) {
                int c_r = c_v.at(sol[j]).first;
                int c_c = c_v.at(sol[j]).second;
                tmp = min(tmp, abs(h_r - c_r) + abs(h_c - c_c));
            }
            result += tmp;
        }
 
        if (answer == -1)
            answer = result;
        else
            answer = min(answer, result);
 
        return;
    }
 
    if (idx == c_v.size()) {
        return;
    }
 
    sol[cnt] = idx;
    backtracking(cnt + 1, idx + 1, m);
    backtracking(cnt, idx + 1, m);
 
    return;
}
 
int main(void) {
    //freopen("input.txt", "r", stdin);
    cin >> N >> M;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            cin >> val;
            if (val == 1) {
                h_v.push_back(make_pair(i, j));
            }
            else if (val == 2) {
                c_v.push_back(make_pair(i, j));
            }
        }
    }
 
    // Backtracking
    for (int i = M; i >= 1; i--) {
        backtracking(00, i);
    }
 
    cout << answer << endl;
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter