Fork me on GitHub

【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;
}
posted @ 2016-11-27 09:25  sxb门徒  阅读(155)  评论(0编辑  收藏  举报