题目描述
房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。
输入输出格式
输入格式:
第一行一个数n (n<=15)
接下来每行2个实数,表示第i块奶酪的坐标。
两点之间的距离公式=sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2))
输出格式:
一个数,表示要跑的最少距离,保留2位小数。
输入输出样例
输入样例#1:
4
1 1
1 -1
-1 1
-1 -1
输出样例#1:
7.41
最优性剪枝。注意浮点数输入输出。double类型输入lf,输出f.
//什么剪枝?
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n;//起点是零
double x[20],y[20],sm=9999999.9;
double s=0.0,dis[20][20];
bool b[20];
void dfs(int r,int t)
{
if(s>sm) return;
for(int i=1;i<=n;i++)
{
if(!b[i])
{
b[i]=1;
s+=dis[r][i];
if(t==n)
{
if(s<sm) sm=s;
}
else dfs(i,t+1);
b[i]=0;
s-=dis[r][i];
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
x[0]=0.0,y[0]=0.0,b[0]=1;
for(int u=0;u<=n;u++)
for(int v=0;v<=n;v++)
dis[u][v]=sqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v]));
// cout<<dis[2][4]<<" "<<dis[2][3]<<" "<<dis[3][4]<<" "<<dis[4][1]<<" "<<dis[1][2]<<endl;
dfs(0,1);
printf("%.2f\n",sm);
}