「洛谷P1433」吃奶酪

链接:洛谷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\n",ans);//输出,保留两位 
    return 0;   
}
posted @ 2019-09-09 19:50  月雩·薇嫭  阅读(273)  评论(1编辑  收藏  举报