알고리즘 풀이/백준

[백준 15686] 치킨 배달

mhko411 2021. 2. 7. 13:46
728x90

문제
도시에서 치킨집을 최대 M개만 남기고 모두 폐업을 시키려고 한다.

집에서는 여러 개의 치킨집 중 거리가 가장 최소인 치킨집에서 시켜먹는다.
이때 최대 M개의 치킨집이 남아있을 때 집과 치킨 사이의 거리의 합이 최소가되는 거리가 무엇인지 구하라

입력
첫재 줄에 N(2이상 50이하)과 M(1이상 13이하)가 주어진다.
둘째 줄부터 N개의 줄에 도시의 정보가 입력되며 0은 빈 칸, 1은 집, 2는 치킨집이다.

출력
최대 M개가 남았을 때 최소 치킨거리를 출력한다.


이 문제에서 치킨 거리를 구하기위해서 집과 치킨의 위치정보가 필요하다. 

따라서 맵을 입력받을 때 집과 치킨의 위치 정보를 따로 저장해두도록한다.

 

이후 1~M개를 선택했을 때 나올 수 있는 조합을 백트래킹을 통해 구하고 선택했다면 치킨 거리를 구한다.

각각의 집에서 최소의 거리인 치킨거리를 구하여 이 치킨 거리를 모두 더한다음 최종해와 비교하도록한다.

 

지금 생각해보니 따로 맵에 대한 정보를 저장할 필요가 없었다.

#include "pch.h"
#include <iostream>
#include<algorithm>
#include <vector>
#include<queue>
using namespace std;

int N, M;
int city_map[51][51];
int answer = 100000000;
vector<pair<int, int>> store;
vector<pair<int, int>> home;
vector<pair<int, int>> pick;


void solve(int next, int topick) {
	if (pick.size() == topick) {
		int total = 0;
		for (int i = 0; i < home.size(); i++) {
			int dist = 999999999;
			for (int j = 0; j < pick.size(); j++) {
				int temp = abs(home[i].first - pick[j].first) + abs(home[i].second - pick[j].second);
				dist = min(dist, temp);
			}
			total += dist;
		}
		answer = min(answer, total);
	}

	for (int i = next; i < store.size(); i++) {
		pick.push_back(store[i]);
		solve(i + 1, topick);
		pick.pop_back();
	}
}
int main()
{
	cin >> N >> M;

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			cin >> city_map[i][j];
			if (city_map[i][j] == 1)
				home.push_back({ i,j });
			else if (city_map[i][j] == 2)
				store.push_back({ i,j });
		}
	}

	for (int i = 1; i <= M; i++) {
		solve(0, i);
		pick.clear();
	}

	cout << answer << endl;
	return 0;
}

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[백준 1012] 유기농 배추 cpp  (0) 2021.02.10
[백준 16236] 아기 상어 cpp  (0) 2021.02.08
[백준 14503] 로봇 청소기 cpp  (0) 2021.02.06
[백준 1946] 신입 사원 cpp  (0) 2021.02.05
[백준 1931] 회의실 배정  (0) 2021.02.05