-
[BOJ] #15686 _ 치킨 배달Problem Solving/BOJ 2019. 8. 4. 09:41
[치킨 배달] https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r과 c는 1부터 시작한다. 이 도시에 사는 사람들은 치킨을 매우 좋아한다. 따라서, 사람들은 "치킨 거리"라는 말을 주로 사용한다. 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다. 즉, 치킨 거리는
www.acmicpc.net
dfs를 이용하여 M개의 치킨 집을 고르는 모든 경우의 수를 탐색한다.
모든 경우의 수 중 최소 거리를 구한다.
[ 소스 코드 ]
#include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> #define MAX_N 50 #define MAX_M 13 using namespace std; int city[MAX_N + 1][MAX_N + 1] = { 0, }, sel[MAX_M + 1] = { 0, }; vector<pair<int, int> > chicken, house; int n, m, min_dist = 999999; int solve(int count, int current); int calc_dist(); int main() { scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &city[i][j]); if (city[i][j] == 1) house.push_back(make_pair(i, j)); if (city[i][j] == 2) chicken.push_back(make_pair(i, j)); } } solve(0, 0); printf("%d\n", min_dist); return 0; } int solve(int count, int current) { if (count == m) { min_dist = min(min_dist, calc_dist()); return 0; } for (int i = current; i < chicken.size(); i++) { sel[count] = i; solve(count + 1, i + 1); } return 0; } int calc_dist() { vector<int> dist(house.size(), 999999); pair<int, int> c_tmp, h_tmp; int total_dist = 0; for (int i = 0; i < m; i++) { c_tmp = chicken[sel[i]]; for (int j = 0; j < house.size(); j++) { h_tmp = house[j]; dist[j] = min(dist[j], abs(c_tmp.first - h_tmp.first) + abs(c_tmp.second - h_tmp.second)); } } for (int i = 0; i < house.size(); i++) total_dist += dist[i]; return total_dist; }
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] #9465 _ 스티커 (0) 2019.08.12 [BOJ] #17143 _ 낚시왕 (0) 2019.08.04 [BOJ] #17140 _ 이차원 배열과 연산 (0) 2019.07.17 [BOJ] #16236 _ 아기상어 (0) 2019.07.11 [BOJ] #13023 _ ABCDE (0) 2019.07.10 댓글