链接:洛谷P1433
题目描述
房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。
输入格式:
第一行一个数n (n<=15)
接下来每行2个实数,表示第i块奶酪的坐标。
两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
输出格式:
一个数,表示要跑的最少距离,保留2位小数。
这是一道搜索难题
直接搜索即可
就不多说了(因为我太弱了)
#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 ",ans);//输出,保留两位 return 0; }