[BOJ] 15686번 : 치킨 배달
2024. 8. 20. 21:50ㆍAlgorithm
1. problem :
https://www.acmicpc.net/problem/15686
2. solution 1 :
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int n, m;
int board[52][52];
vector<pair<int, int>> house;
vector<pair<int, int>> all_chicken;
vector<pair<int, int>> cho_chicken;
bool isUsed[15];
int mn_dist = 15000;
void chickenDist(int cnt, int target_cnt) {
if (target_cnt == cnt) {
int dist_sum = 0;
for (int i = 0; i < house.size(); i++) {
int house_mn_dist = 200;
for (int j = 0; j < cho_chicken.size(); j++) {
int dist = 0;
int diff_x = abs(house[i].X - cho_chicken[j].X);
int diff_y = abs(house[i].Y - cho_chicken[j].Y);
dist += diff_x;
dist += diff_y;
house_mn_dist = min(house_mn_dist, dist);
}
dist_sum += house_mn_dist;
}
mn_dist = min(mn_dist, dist_sum);
}
for (int i = 0; i < all_chicken.size(); i++) {
if (!isUsed[i]) {
isUsed[i] = true;
cho_chicken.push_back({ all_chicken[i].X,all_chicken[i].Y });
chickenDist(cnt + 1, target_cnt);
isUsed[i] = false;
cho_chicken.pop_back();
}
}
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> board[i][j];
if (board[i][j] == 1) house.push_back({ i,j });
else if (board[i][j] == 2) all_chicken.push_back({ i,j });
}
}
chickenDist(0, m);
cout << mn_dist << '\n';
}
실패한 코드 , 시간 초과가 났다.
3. solution 2 :
// Authored by : BaaaaaaaaaaarkingDog
// Co-authored by : -
// http://boj.kr/445279200beb4050ac92ffc9dc68d68b
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int board[55][55];
int n, m;
vector<pair<int,int>> chicken;
vector<pair<int,int>> house;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >> board[i][j];
if(board[i][j] == 1) house.push_back({i, j});
if(board[i][j] == 2) chicken.push_back({i, j});
}
}
vector<int> brute(chicken.size(), 1);
fill(brute.begin(), brute.begin() + chicken.size() - m, 0); // 앞의 chicken.size() - m 칸은 0, 뒤의 m칸은 1
int mn = 0x7f7f7f7f; // 답을 저장할 변수
do{
int dist = 0; // 도시의 치킨 거리를 저장할 변수
for(auto h : house){
int tmp = 0x7f7f7f7f; // 집의 치킨 거리를 저장할 변수
for(int i = 0; i < chicken.size(); i++){
if(brute[i] == 0) continue;
tmp = min(tmp, abs(chicken[i].X - h.X) + abs(chicken[i].Y - h.Y)); // 집의 치킨 거리 갱신
}
dist += tmp;
}
mn = min(mn, dist);
}while(next_permutation(brute.begin(), brute.end()));
cout << mn;
}
source code 출처 : https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x0D/solutions/15686.cpp
basic-algo-lecture/0x0D/solutions/15686.cpp at master · encrypted-def/basic-algo-lecture
바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.
github.com
next_permutation을 이용한 코드
'Algorithm' 카테고리의 다른 글
| [BOJ] 14891번 : 톱니바퀴 (0) | 2024.08.21 |
|---|---|
| [BOJ] 11559번 : Puyo Puyo (0) | 2024.08.21 |
| [BOJ] 12100번 : 2048 (Easy) (0) | 2024.08.20 |
| [BOJ] 18808번 : 스티커 붙이기 (0) | 2024.08.20 |
| [BOJ] 15683번 : 감시 (0) | 2024.08.19 |