[백준 15686번 C/C++] 치킨 배달

 

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

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net


 

 

해결전략

 

백트래킹, Backtracking

 


 

 

정답 코드

 

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

int n, m; // n: 도시 크기, m: 선택할 치킨집의 개수
int answer = 2147000000; // 최소 치킨 거리를 저장할 변수
vector<vector<int>> v;
vector<pair<int, int>> house, chicken, delevery;
int ch[14]; // 치킨집 체크

int Distance() // 각 집에서 치킨집까지의 거리를 측정하는 함수
{
	int sum = 0;
	for(int i=0; i<house.size(); i++)
	{
		int y = house[i].first;
		int x = house[i].second;
		int d = 2147000000;

		// 각 집의 좌표를 기준으로 선택된 치킨집들과의 거리를 계산하고, 그 중 가장 짧은 거리를 찾아 더해준다.
		for (int j = 0; j < delevery.size(); j++)
		{
			int ny = delevery[j].first;
			int nx = delevery[j].second;
			int dist = abs(ny - y) + abs(nx - x);

			d = min(d, dist);
		}
		sum = sum + d;
	}

	return sum; // 총 치킨 거리를 반환
}

// 치킨집을 선택하는 함수, 조합(Combination)을 사용
// 모든 치킨집 중에서 m개를 선택하는 모든 조합에 대해 최소 치킨 거리를 계산하고, 그 중 가장 작은 값을 찾아 answer에 저장. 이 때, idx는 조합을 구할 때 시작할 인덱스를 의미하고, cnt는 현재까지 선택한 치킨집의 개수를 의미한다.
void Delivery(int idx, int cnt) 
{
	// m개의 치킨집을 모두 선택했을 경우
	if(cnt == m){ 
		answer = min(answer, Distance()); // 최소 치킨 거리를 업데이트
		return;
	}

	for(int i=idx; i<chicken.size(); i++)
	{
		if (ch[i] == 0)
		{
			delevery.push_back(chicken[i]);

			ch[i] = 1;
			Delivery(i, cnt + 1);
			ch[i] = 0;

			delevery.pop_back();
		}
	}
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin >> n >> m;
	v.resize(n, vector<int>(n));
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < n; x++) {
			cin >> v[y][x];

			if (v[y][x] == 1) {
				house.push_back({ y, x });
			}
			else if (v[y][x] == 2) {
				chicken.push_back({ y, x });
			}
		}
	}
	
	Delivery(0, 0);

	cout << answer << "\n";

	return 0;
}

 

 


 

'⭐ 코딩테스트 > 백준' 카테고리의 다른 글

[백준 14502번 C/C++] 연구소  (0) 2023.11.19
[백준 15683번 C/C++] 감시  (0) 2023.11.18
[백준 16953번 C/C++] A → B  (0) 2023.11.14
[백준 7576번 C/C++] 토마토  (0) 2023.11.06
[백준 1806번 C/C++] 부분합  (0) 2023.10.31