1. 程式人生 > >【搜尋】洛谷 P1433 吃乳酪

【搜尋】洛谷 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<cstdio>
#include<cstdlib>
#include<cstring> #include<iostream> #include<cmath> using namespace std; const int MAXN=30; struct point { double x; double y; }a[MAXN]; int n; double f[MAXN][MAXN]; bool c[MAXN]; double ans=999999.00; void search(int k,double s,int step) { if(s>=ans)return ; if(k>n) { ans=min(ans,s); return
; } for(int i=1;i<=n;i++) { if(c[i]) { c[i]=false; search(k+1,s+f[step][i],i); c[i]=true; } } } int main() { cin>>n; for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y); for(int i=1;i<=n;i++) { f[i][0
]=sqrt(a[i].x*a[i].x+a[i].y*a[i].y); f[0][i]=f[i][0]; for(int j=1;j<=n;j++)f[i][j]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)); } memset(c,true,sizeof(c)); search(1,0,0); printf("%.2lf",ans); return 0; }