*로직
1. 완탐? 13C6 * 50 * 13 <1억 -> ok
2.for(13Cm) for (home) for(치킨) min갱신,ret갱신
* 조합핵심코드
/*
* * 조합함수 암기
*
* 결과 : idx 조합결과
* chichenList[0] -> [0,1]
* chichenList[1] -> [0,2]
* chichenList[2] -> [1,2]
*/
void combi(int start, vector<int> v) {
if (v.size() == m) {
chickenList.push_back(v);
return;
}
for (int i = start + 1; i < chicken.size(); i++) {
v.push_back(i);
combi(i, v);
v.pop_back(); //원복
}
return;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
int m, n,ret,result=987654321;
//char a[54][54];
int a[54][54];
vector<pair<int, int>> chicken,home;
vector<vector<int>> chickenList;
/*
* * 조합함수 암기
*
* 결과 : idx 조합결과
* chichenList[0] -> [0,1]
* chichenList[1] -> [0,2]
* chichenList[2] -> [1,2]
*/
void combi(int start, vector<int> v) {
if (v.size() == m) {
chickenList.push_back(v);
return;
}
for (int i = start + 1; i < chicken.size(); i++) {
v.push_back(i);
combi(i, v);
v.pop_back(); //원복
}
return;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL); cout.tie(NULL);
cin >> n >>m;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> a[i][j];
if (a[i][j] == 1) home.push_back({ i,j });
if (a[i][j] == 2) chicken.push_back({ i,j });
}
}
//입력끝
vector<int> v;
combi(-1, v);
for (vector<int> chList : chickenList)
{
int ret = 0;
for (pair<int, int> p : home)
{
int _min = 987654321;
for (int ch : chList)
{
int temp= abs(chicken[ch].first - p.first)
+ abs(chicken[ch].second - p.second);
_min = min(_min, temp);
}
ret += _min;
}
result = min(result, ret);
}
cout << result;
return 0;
}
'Algorithm > boj' 카테고리의 다른 글
백준 16234 인구이동 // ny,nx만처리하는 bfs / main에서 v[y][x]처리 / vector &v로 함수내 전역변수 사용 (1) | 2023.06.01 |
---|---|
백준 4179 // 갈수있는지조사는 bfs visit 비교 (0) | 2023.05.31 |
백준 1325 // 자식수찾기는 int dfs(ret=1, ret+=dfs) (0) | 2023.05.27 |
백준 17298 // 짝짓기는 stack(push[idx]) / 막대그림을그려라 (0) | 2023.05.23 |
백준 1068 // 2차원벡터선언법 / 트리문제는 root 1개만 남는상황 예외처리하라 / 리프노드 카운팅은 int dfs (0) | 2023.05.23 |