题目描述
房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。
输入输出格式
输入格式:
第一行一个数n (n<=15)
接下来每行2个实数,表示第i块奶酪的坐标。
两点之间的距离公式=sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2))
输出格式:
一个数,表示要跑的最少距离,保留2位小数。
原题链接:https://www.luogu.org/problemnew/show/P1433
/*
输入:
4
1 1
1 -1
-1 1
-1 -1
输出:
7.41
*/
#include <iostream>
#include <cmath>
using namespace std;
int n;
float m = 0x3f3f3f3f;//初始化最小距离为一个很大的数
float a[20][20];//存储各个点之间的距离(包括原点)
float x[20], y[20];//存储坐标
int vis[20];//标记
void dfs(int step, float dis, int x)
{
cout << step << " " << x << endl;
//step是深度(即当前是吃第step块奶酪)
//dis代表当前路程
//x代表奶酪的编号
if (step == n)
{
if (m > dis)
{
m = dis;
}
return;
}
for (int i = 1; i <= n; i++)
{
if (!vis[i])
{
if (dis + a[i][x] > m)
{
continue;
}
vis[i] = 1;
//下一次搜索从当前编号奶酪开始,深度+1,距离+当前单步距离
dfs(step + 1, dis + a[i][x], i);
vis[i] = 0;
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{//i为奶酪编号
cin >> x[i] >> y[i];
}
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= n; j++)
{
//计算并存储距离
a[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}
}
dfs(0, 0, 0);
printf("%.2lf", m);
return 0;
}