分析
题目大意:
选择一个路径,吃n个奶酪,使得路径最短。
step1:n
step2:n-1
......
stepn:1
n*(n-1)*...*1=n!种情况
dfs->枚举所有的情况(穷举)
时间复杂度:n!>>1e8
根据该题的拿数据范围搜索只能90分
搜索代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=40;
int n;
struct Node{
double x,y;
}p[N];
double ans=2e9;//求最小值
bool vis[N];//是否被吃过
double get(double ax,double ay,double bx,double by){
return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));//求距离
}
void dfs(double x,double y,int sum,double len){
if(len>=ans) return;//已经超出了当前的最优解
if(sum==n){//吃完了—>路径走完了 终止条件
if(len<ans)
ans=len;//有更优解记录
return;
}
for(int i=1;i<=n;i++){
if(vis[i]==true) continue;//已经被吃过
vis[i]=true;//记录是否被吃过
dfs(p[i].x,p[i].y,sum+1,len+get(x,y,p[i].x,p[i].y));
vis[i]=false;//回溯取消影响
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>p[i].x>>p[i].y;
dfs(0,0,0,0);//开始搜索
cout<<fixed<<setprecision(2)<<ans;//输出答案
return 0;
}