题目描述
房间里放着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; }