题目描述
房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。
输入输出格式
输入格式:
第一行一个数n (n<=15)
接下来每行2个实数,表示第i块奶酪的坐标。
两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
输出格式:
一个数,表示要跑的最少距离,保留2位小数。
输入输出样例
输出样例#1:
7.41
解题思路:
记忆化搜索,看代码(注释)
AC代码:
1 #include<cstdio> 2 #include<cmath> 3 #define min(a,b) a<b?a:b 4 using namespace std; 5 int n; 6 double f[20][20]; 7 double x[20],y[20],ans = 999999999999.0;//要求最小值,将答案初始化很大很大 8 bool v[20]; 9 void dfs(int s,int now,double l) { 10 if(l > ans) return ;//剪枝,如果没有会TLE,如果当前路径已经比答案大,那么不能是最优解了,直接返回 11 if(s == n) {//走完n个点 12 ans = min(ans,l);//更新答案 13 return ; 14 } 15 for(int i=1;i<=n;i++) //枚举所有点 16 if(!v[i]) {//没走过 17 v[i]=1; //标记 18 dfs(s+1,i,l+f[now][i]); 19 v[i]=0; //回溯 20 } 21 } 22 int main() 23 { 24 scanf("%d",&n); 25 for(int i = 1;i <= n; i++) 26 scanf("%lf%lf",&x[i],&y[i]); 27 x[0] = 0;y[0] = 0; 28 for(int i = 0;i <= n; i++) 29 for(int j = 0;j <= n; j++) 30 f[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//预处理两点的距离 31 dfs(0,0,0.0);//已走过0个点 上一个点是第0个点 已走了长0.0的路径 32 printf("%.2lf",ans); 33 return 0; 34 }