洛谷P1433 吃奶酪
题目链接:https://www.luogu.org/problem/P1433
参考代码:
#include<bits/stdc++.h>
using namespace std;
int n;
double dis[16][16],ans=100000,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()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>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);
cout<<setiosflags(ios::fixed)<<setprecision(2)<<ans<<endl;
}