반응형
20분 소요.
벡터 명에 select, home과 같은 단어 사용하지 말것.
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int N, M;
int arr[51][51];
int mina;
vector<pair<int, int> > home;
vector<pair<int, int> > chicken;
vector<pair<int, int> > select;
void DFS(int idx, int cur)
{
if (cur == M)
{
int sum = 0;
for (int i = 0; i < home.size(); i++)
{
int minx = 987654321;
for (int j = 0; j < select.size(); j++)
{
if (abs(home[i].first - select[j].first) + abs(home[i].second - select[j].second) < minx)
{
minx = abs(home[i].first - select[j].first) + abs(home[i].second - select[j].second);
}
}
sum += minx;
}
if (sum < mina)
{
mina = sum;
}
return;
}
for (int i = idx + 1; i < chicken.size(); i++)
{
select.push_back({ chicken[i].first,chicken[i].second });
DFS(i, cur+1);
select.pop_back();
}
}
int main(int argc, char** argv)
{
cin >> N >> M;
mina = 987654321;
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
cin >> arr[i][j];
}
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
if (arr[i][j] == 1)
{
home.push_back({ i,j });
}
else if (arr[i][j] == 2)
{
chicken.push_back({ i,j });
}
}
}
int c = chicken.size();
for (int i = 0; i < c; i++)
{
select.push_back({ chicken[i].first,chicken[i].second });
DFS(i, 1);
select.pop_back();
}
cout << mina << endl;
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형
'Algorithm' 카테고리의 다른 글
7829. 보물왕 태혁 (0) | 2020.05.01 |
---|---|
1486. 장훈이의 높은 선반 (0) | 2020.04.30 |
4301. 콩 많이 심기 (0) | 2020.04.29 |
4050. 재관이의 대량 할인 (0) | 2020.04.28 |
6109. 추억의 2048게임 (0) | 2020.04.27 |