문제
https://www.acmicpc.net/problem/15686
브루트 포스 문제...시간복잡도 때메 가져왔다.
풀이
1. 백트래킹으로 모든 치킨집 경우의 수를 조합으로 구하기
2. 구한 조합과 집 사이 거리를 모두계산해서 최소값 구하기
시간복잡도 :
최대 경우의수 : 17C7 = 1716 대충 2000
최대 집수 : 100
비교수 : 100 * 7 = 700
700 * 2000 = 1400000
통과는하지만 그렇게 빠르진 않다.
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define INF 1e9;
int N,M;
int answer = INF;
vector <pair<int,int>> chicken;
vector <pair<int,int>> chicken_temp;
vector <pair<int,int>> house;
void check_min(){
int temp_sum = 0;
for (int i = 0; i < house.size(); ++i) {
int temp_dis = INF;
for (int j = 0; j < chicken_temp.size(); ++j) {
temp_dis = min(temp_dis, abs(house[i].X - chicken_temp[j].X) + abs(house[i].Y - chicken_temp[j].Y));
}
temp_sum += temp_dis;
}
answer= min(temp_sum, answer);
}
void DFS(int cnt, int x){
if(cnt == M) {
check_min();
return;
}
for (int i = x; i < chicken.size()-(M-cnt-1); ++i) {
chicken_temp.push_back({chicken[i]});
DFS(cnt + 1, i + 1);
chicken_temp.pop_back();
}
}
int main(){
cin >> N >> M;
int num;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
cin >> num;
if(num == 2) chicken.push_back({i,j});
if(num == 1) house.push_back({i,j});
}
}
DFS(0, 0);
cout << answer;
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1로 만들기 C++ 두가지 풀이 BFS, DP (0) | 2024.09.03 |
---|---|
[백준] DP 2294번 동전2 C++풀이 (1) | 2024.09.03 |
[백준] DP 2293번 동전1 C++ 풀이 (0) | 2024.09.03 |
[백준] 1915번 최소비용 구하기 C++ 풀이 (1) | 2024.08.28 |
[백준] 14502번 연구소 C++ 풀이 (3) | 2024.08.28 |