洛谷 P1433 吃奶酪

题目描述

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

输入输出格式

输入格式:

 

第一行一个数n (n<=15)

接下来每行2个实数,表示第i块奶酪的坐标。

两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

 

输出格式:

 

一个数,表示要跑的最少距离,保留2位小数。

 

输入输出样例

输入样例#1: 复制
4
1 1
1 -1
-1 1
-1 -1
输出样例#1: 复制
7.41
思路:搜索。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
double ans=0x7f7f7f7f;
struct nond{
    double x,y;
}cnt[16];
int vis[16];
double dis[16][16];
void dfs(int tot,double sum,int pre){
    if(sum>ans)    return ; 
    if(tot==n){
        ans=min(ans,sum);
        return ;
    }
    for(int i=1;i<=n;i++)
        if(!vis[i]){
            vis[i]=1;
            dfs(tot+1,sum+dis[pre][i],i);
            vis[i]=0;
        }
} 
int main(){
    scanf("%d",&n);
    cnt[0].x=0;cnt[0].y=0;
    for(int i=1;i<=n;i++)
        scanf("%lf%lf",&cnt[i].x,&cnt[i].y);
    for(int i=0;i<=n;i++)
        for(int j=i;j<=n;j++)
            dis[i][j]=dis[j][i]=sqrt((cnt[i].x-cnt[j].x)*(cnt[i].x-cnt[j].x)+(cnt[i].y-cnt[j].y)*(cnt[i].y-cnt[j].y));
    vis[0]=1;
    dfs(0,0,0);
    printf("%.2lf",ans); 
}

 

 
posted @ 2017-11-26 19:22  一蓑烟雨任生平  阅读(197)  评论(0编辑  收藏  举报