백준 15686 치킨배달 c++

2023. 7. 27. 17:22알고리즘

//15686
#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;

int N, M;
int arr[51][51];
int ans;

vector<pair<int, int>> v;
vector<pair<int, int>> house;

void calclulate(vector<pair<int, int>> &chicken){
	int total = 0;
	for (int i = 0;i < house.size();i++) {
		int val = 987654321;
		for (int j = 0;j < chicken.size();j++) {
			val = min(val, abs(chicken[j].first - house[i].first) + abs(chicken[j].second - house[i].second));
		}
		total += val;
	}
	ans = min(ans, total);
}

void choose(int cnt, int start, vector<pair<int, int>>& chicken) {
	if (cnt == M) {
		calclulate(chicken);
	}
	for (int i = start;i < v.size();i++) {
		chicken.push_back({ v[i].first, v[i].second });
		choose(cnt + 1, i + 1, chicken);
		chicken.pop_back();
	}
}

int main(void) {
	cin.tie(0);
	ios::sync_with_stdio(false);
	cin >> N >> M;
	ans = 987654321;
	for (int i = 0;i < N;i++) {
		for (int j = 0;j < N;j++) {
			cin >> arr[i][j];
			if (arr[i][j] == 2) {
				v.push_back({ i, j });
			}
			else if (arr[i][j] == 1) {
				house.push_back({ i, j });
			}
		}
	}
	vector<pair<int, int>> t;
	choose(0, 0, t);

	cout << ans << endl;
	return 0;
}

 

1. permutation이 아닌 dfs를 통해 겹치는 값없이 조합을 구했다.

2. 여러번 틀렸는데 틀린 이유 : ans 값을 초기화하지 않았다. 그리고 val 값을 999999 정도로 초기화했는데 이부분이 문제였던거같다

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

백준 13458 c++ 시험감독  (0) 2023.08.01
백준 3190 뱀 c++  (2) 2023.08.01
백준 15683 c++  (0) 2023.07.26
boj14891 톱니바퀴 c++  (1) 2023.07.25
백준 14502번 - 연구소 c++ 풀이  (0) 2023.07.22