洛谷 P1433 吃奶酪
阿新 • • 發佈:2017-09-10
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.41dfs 屠龍寶刀點擊就送
#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 吃奶酪