
题目描述
房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。
输入输出格式
输入格式:
第一行一个数n (n<=15)
接下来每行2个实数,表示第i块奶酪的坐标。
两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
输出格式:
一个数,表示要跑的最少距离,保留2位小数。
输入输出样例
输入样例:
- - - -
输出样例:
7.41
[思路]:dfs+剪枝
这里用的剪枝是最优性剪枝,顾名思义就是如果当前的距离都大于你记录的最小距离了,你搜也没意思了。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #include<string> #include<cstring> using namespace std; ; ; inline int read() { char c = getchar(); , f = ; ') { ; c = getchar(); } + c - ', c = getchar(); return x * f; } ]; ]; ]; ][]; double ans=1231234424.0; void dfs(int done/*×ß¹ý¶àÉÙµã*/,int now/*ÏÖÔڵĵã*/,double tot/*¾àÀë*/ ) { if(tot>ans) { //ССµÄ¼ôÖ¦£¬×îÓÅÐÔ¼ôÖ¦ return ; } if(done==n) { if(tot<ans) { ans=tot; } return ; } ; i<=n; ++i) { if(!v[i]) { v[i]=; dfs(done+,i,tot+dis[now][i]); v[i]=; //»ØËÝ } } } int main() { cin>>n; ; i<=n; i++) cin>>x[i]>>y[i]; x[]=; y[]=; ; i<=n; i++) ; 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("%.2f",ans); ; }