728x90
반응형
목차
https://www.acmicpc.net/problem/15686
문제
문제 구현 방향
문제의 범위를 보면 충분히 무식하게 탐색할 수 있는 범위이다.
따라서 모든 조합을 구해 모두 탐색해 보면 구할 수 있는 문제이다.
구현 시 참고
https://be-senior-developer.tistory.com/49
코드 구현
#include <iostream>
#include<vector>
#include<math.h>
#include<map>
#include<queue>
#include<algorithm>
#include<string>
using namespace std;
vector<int> ans; //치킨거리 저장해 놓을 곳
vector<pair<int, int>> house; //폐업할 치킨 집
vector<pair<int, int>> m; //조합을 저장할 곳
int original[100][100] = { 0 };
int board[100][100] = { 0 };
int N, M;
void reset() { //초기화 해주는 함수
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
board[i][j] = original[i][j];
}
}
}
void close(vector <pair<int, int>>& v) { // 치킨집 폐업 함수
for (auto p: v)
board[p.second][p.first] = 0;
}
int search(int x, int y) { //탐색해서 가장 작은 값 반환
int min = 50000;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] == 2) {
int diameter = abs(i - y) + abs(j - x);
if (min > diameter)
min = diameter;
}
}
}
return min;
}
void combi(int idx, vector <pair<int, int>> v) {
if (v.size() == house.size() - M) { //폐업하고 남은수에 다다를 경우
reset();
close(v);
int sum = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] == 1)
sum += search(j, i);
}
}
ans.push_back(sum);
return;
}
for (int i = idx; i < house.size(); i++) {
v.push_back({ house[i].first, house[i].second });
combi(i + 1, v);
v.pop_back();
}
}
int main() {
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> original[i][j];
if (original[i][j] == 2) //원본 배열 따로 저장
house.push_back({ j, i }); //치킨집 좌표 미리 저장
}
}
combi(0, m);
cout << *min_element(ans.begin(), ans.end()); //가장 작은 값 반환
}
반응형
'백준 문제풀이' 카테고리의 다른 글
[백준][dfs] 16234 인구 이동 c++ 구현 (0) | 2024.05.11 |
---|---|
[백준][bfs] 2589 보물섬 c++ 구현 (0) | 2024.05.10 |
[백준][문자열] 2870 수학숙제 c++구현 (0) | 2024.05.07 |
[백준][문자열] 9375 패션왕 신해빈 c++구현 (0) | 2024.05.05 |
[백준][문자열] 1213 팰린드롬 만들기 c++ 구현 (0) | 2024.05.04 |