题目描述
房间里放着 n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0) 点处。
输入格式
第一行一个正整数 n。
接下来每行 2个实数,表示第i块奶酪的坐标。
两点之间的距离公式为
传送门
输出格式
一个数,表示要跑的最少距离,保留 2 位小数。
思路
这道题比较简单只要用剪枝就可以完成。但是剪枝不要剪错。(记得开O2)
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int n;
double minn = 10000000000000;
bool vis[25];
double len[25];
struct cheese
{
double x, y;
}a[25];
void dfs(double x, double y, double sum, int hv)
{
if(sum > minn) return;//剪枝
if(hv == n)
{
minn = min(minn, sum);
return;
}
for(int i = 1;i <= n;i++)
if(vis[i] == 0)
{
vis[i] = 1;
dfs(a[i].x, a[i].y, sum + 1.0 * sqrt((x - a[i].x) * (x - a[i].x) + (y - a[i].y) * (y - a[i].y)), hv + 1);
vis[i] = 0;
}
}
int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
cin >> n;
for(int i = 1;i <= n;i++)
cin >> a[i].x >> a[i].y;
dfs(0.0, 0.0, 0.0, 0);
cout << fixed << setprecision(2) << minn << endl;
return 0;
}