题目描述
房间里放着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 1
1 -1
-1 1
-1 -1
输出样例#1:
复制
7.41
直接暴力会超时,剪枝一下。。。
#include<bits/stdc++.h>
using namespace std;
double sum=0,ans=1000000000;int n; double a[20],b[20],c[20];double dis[20][20];
void dfs(int w,int r)
{
if(sum>ans)//这剪枝有点。。。
return ;
if(r==n)
{
if(ans>sum)
ans=sum;
return ;
}
for(int i=1;i<=n;i++)
{
if(c[i]==0)
{
sum=sum+dis[w][i];
c[i]=1;
dfs(i,r+1);
c[i]=0;
sum=sum-dis[w][i];
}
}
}
int main()
{
scanf("%d",&n);
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%lf %lf",&a[i],&b[i]);
}
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
dis[i][j]=sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]));
}
c[0]=1;
dfs(0,0);
printf("%.2lf\n",ans);
return 0;
}