1. 程式人生 > >洛谷 P1433 吃奶酪

洛谷 P1433 吃奶酪

left 一行 blog www ide ans footer foo targe

題目描述

房間裏放著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
dfs 屠龍寶刀點擊就送
#include <cstdio>
#include 
<cmath> #define N 25 double calc(double x1,double y1,double x2,double y2) { return sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2)); } int n; bool vis[N]; double f[N][N],x[N],y[N],ans=1e9; double minn(double a,double b) {return a>b?b:a;} void dfs(int now,int num,double dist) {
if(num==n) {ans=minn(ans,dist);return;} if(dist>ans) return; for(int i=1;i<=n;++i) { if(now==i||vis[i]) continue; vis[i]=1; dfs(i,num+1,dist+f[now][i]); vis[i]=0; } } int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("
%lf%lf",&x[i],&y[i]),f[0][i]=calc(0,0,x[i],y[i]); for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j) f[i][j]=f[j][i]=calc(x[i],y[i],x[j],y[j]); dfs(0,0,0); printf("%.2lf",ans); return 0; }

洛谷 P1433 吃奶酪