/*
题型:dfs
注意:预处理,回溯
*/
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
double dis[16][16],ans=1000000000.0,now,x[16],y[16];//两点距离(预处理),答案,现在的距离,每个点的坐标
bool vis[16];//奶酪是否被吃
void dfs(int pos,int num)//pos第几块奶酪 num吃的第几块
{
if(now>ans)//如果现在的距离比原来的大就返回
return;
if(num==n)
{
if(ans>now)//更新答案
ans=now;
return;
}
vis[pos]=true;
for(int i=1;i<=n;i++)
{
if(vis[i]==false)//枚举每个没有被吃的奶酪
{
now+=dis[pos][i];//加上距离
dfs(i,num+1);
now-=dis[pos][i];//回溯
}
}
vis[pos]=false;//回溯
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);//输入地图
x[0]=0;y[0]=0;//现在的距离
for(int i=0;i<=n;i++)//预处理两点距离
for(int j=0;j<=n;j++)
dis[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
dfs(0,0);
printf("%0.2f",ans);
}
P1433 吃奶酪
最新推荐文章于 2023-01-01 17:14:27 发布