zoukankan      html  css  js  c++  java
  • 【luogu】 P1433 吃奶酪

    题目描述
    房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。

    输入格式:
    第一行一个数n (n<=15)
    接下来每行2个实数,表示第i块奶酪的坐标。
    两点之间的距离公式=sqrt((x1-x2) * (x1-x2)+(y1-y2) * (y1-y2))

    输出格式:
    一个数,表示要跑的最少距离,保留2位小数。

    原题戳这里
    深搜,记录上一个点和已经吃了多少块奶酪,再立一个flag,防止一块奶酪吃很多次
    再就是剪枝,不剪枝会超时,如果距离已经大于了最小值,就不必继续进行计算了,然后轻松AC

    #include <iostream>
    #include <cmath>
    #include <cstdio>
    using namespace std;
    double ds,minn=9999.0,dis[20][20],d[20][2];
    int n,f[20];
    void dfs(int l,int tot)
    {
        if(tot==n&&minn>ds)
        {
            minn=ds;
            return ;
        }
        else if(tot==n)
            return ;
        for(int i=1;i<=n;i++)
        {
            if(f[i]==0)
            {
                 f[i]=1;
                 ds+=dis[l][i];
                 if(ds<minn)
                    dfs(i,tot+1);
                 f[i]=0;
                 ds-=dis[l][i];
            }
        }
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>d[i][1]>>d[i][2];
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
                dis[i][j]=sqrt((d[j][1]-d[i][1])*(d[j][1]-d[i][1])+(d[j][2]-d[i][2])*(d[j][2]-d[i][2]));
        dfs(0,0);
        printf("%.2lf",minn); 
        return 0;
    }
  • 相关阅读:
    常用模块Part(1)
    递归函数
    python 生成器函数
    python 迭代器与生成器
    python 函数进阶
    python 装饰器进阶
    python time模块
    python 初始函数
    python 文件操作
    python 一些小知识
  • 原文地址:https://www.cnblogs.com/oiersyp/p/6241642.html
Copyright © 2011-2022 走看看