https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸
www.acmicpc.net
#include <bits/stdc++.h>
// [C++] 삼성 SW 역량 테스트 기출문제 백준
int ret = INT_MAX;
int n, m;
int map[50][50];
std::vector<std::pair<int, int>> houses;
std::vector<std::pair<int, int>> stores;
std::vector<std::pair<int, int>> sels;
int dist(std::pair<int, int> & lhs, std::pair<int, int> & rhs){
return std::abs(lhs.first - rhs.first) + std::abs(lhs.second - rhs.second);
}
void dfs(int cnt, int depth) {
if (cnt == m) {
int sum = 0;
for (int i = 0; i < houses.size(); ++i){
int dis = INT_MAX;
for (int j = 0; j < sels.size(); ++j){
dis = std::min(dis, dist(houses[i], sels[j]));
}
sum += dis;
}
ret = std::min(ret, sum);
return;
}
if (depth == stores.size()) return;
sels.push_back(stores[depth]);
dfs(cnt + 1, depth + 1);
sels.pop_back();
dfs(cnt, depth + 1);
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> n >> m;
for (int i = 0; i < n; ++i){
for (int j = 0; j < n; ++j){
std::cin >> map[i][j];
if (map[i][j] == 1){
houses.push_back({i, j});
}
else if (map[i][j] == 2){
stores.push_back({i, j});
}
}
}
dfs(0, 0);
std::cout << ret << '\n';
return 0;
}
'삼성 SW 역량 테스트 기출문제' 카테고리의 다른 글
[C++] 삼성 SW 역량 테스트 기출문제 백준 16235 - 나무 재테크 (0) | 2023.07.11 |
---|---|
[C++] 삼성 SW 역량 테스트 기출문제 백준 16234 - 인구 이동 (0) | 2023.07.11 |
[C++] 삼성 SW 역량 테스트 기출문제 백준 15683번 - 감시 (0) | 2023.07.11 |
[C++] 삼성 SW 역량 테스트 기출문제 백준 14891번 - 톱니바퀴 (0) | 2023.07.11 |
[C++] 삼성 SW 역량 테스트 기출문제 백준 14499번 - 주사위 굴리기 (0) | 2023.07.10 |