问题描述:
解题思路:
枚举每种吃奶酪顺序,并计算其距离,选择最小的距离即答案。v数组:记录顺序。
注意点:1. 每次用于min的s需要重置为0。
2. 实数包括小数,所以结构体内x,y为double类型。
3. 第一次从原点开始出发要特判,即dis(a[0](原点),a[v[i]](第一个顺序点))
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n;
struct Node{
double x, y; // 注意点2
}a[9];
double dis(Node a, Node b){
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
void slove(){
cin >> n;
a[0].x = 0, a[0].y = 0;
for(int i = 1; i <= n; i++)
{
cin >> a[i].x >> a[i].y;
}
vector<int> v;
for(int i = 1; i <= n; i++)
{
v.push_back(i);
}
double sum = 1e18;
do{
double s = 0; // 注意点1:因为s是计算每种顺序计的最小值,所以枚举每种顺序时需要重置
for(int i = 0; i < n; i++)
{
if(i == 0)s += dis(a[v[i]], a[0]); // 注意点3
if(i)s += dis(a[v[i]], a[v[i - 1]]);
}
sum = min(sum, s);
}while(next_permutation(v.begin(), v.end()));
cout << fixed << setprecision(2) << sum ;
}
int main()
{
slove();
return 0;
}
知识点:全排列的使用