1일1알

백준 15686번 치킨 배달 C++ 본문

알고리즘

백준 15686번 치킨 배달 C++

영춘권의달인 2021. 12. 31. 13:56

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

백트래킹을 이용하여 치킨집이 m개일 모든 경우를 구하고, 각 경우마다 각 집에서 가장 가까운 치킨집의 거리의 합 중 최솟값을 구하는 방식으로 문제를 해결하였다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>

using namespace std;
typedef long long ll;

int n, m;
vector<pair<int, int>> houses;
vector<pair<int, int>> wholeChickens;
vector<pair<int, int>> myChickens;
int ans = 987654321;

int GetDist() {
	int sum = 0;
	for (auto house : houses) {
		int mindist = 987654321;
		for (auto chicken : myChickens) {
			int dist = abs(house.first - chicken.first) + abs(house.second - chicken.second);
			mindist = min(mindist, dist);
		}
		sum += mindist;
	}
	return sum;
}

void BT(int idx) {
	if (myChickens.size() == m) {
		ans = min(ans, GetDist());
		return;
	}
	for (int i = idx; i < wholeChickens.size(); i++) {
		myChickens.push_back(wholeChickens[i]);
		BT(i + 1);
		myChickens.pop_back();
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			int input;
			cin >> input;
			if (input == 1) {
				houses.push_back({ i,j });
			}
			else if (input == 2) {
				wholeChickens.push_back({ i,j });
			}
		}
	}
	BT(0);
	cout << ans;
};

'알고리즘' 카테고리의 다른 글

백준 2225번 합분해 C++  (0) 2022.01.02
백준 3190번 뱀 C++  (0) 2022.01.01
백준 14503번 로봇 청소기 C++  (0) 2021.12.30
백준 7562번 나이트의 이동 C++  (0) 2021.12.29
백준 14502번 연구소 C++  (0) 2021.12.28