这是一道搜索难题
就不多说了(因为我太弱了)
#include<bits/stdc++.h> #define prf printf #define scf scanf using namespace std; int n; double b[20],a[20],vis[20],ans=999999.9; void Dfs(int k,double p,double x,double y) { if(k==n)//走完所有店 { ans=min(ans,p);//更新答案 return;//返回 } for(int i=1;i<=n;i++) { if(!vis[i]&&ans>p)//如果未被用过且当前路径小于最小路径(剪枝) { vis[i]=1;//记录被用过 Dfs(k+1,p+sqrt((a[i]-x)*(a[i]-x)+(b[i]-y)*(b[i]-y)),a[i],b[i]);//搜索下一层 vis[i]=0;//回溯 ,将标记的点取消标记 } } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf",&a[i],&b[i]);//输入 Dfs(0,0.0,0,0);//搜索 printf("%.2lf\n",ans);//输出,保留两位 return 0; }