直角坐标系中,有 nn 个点。要求先从左往右走,再从右往左走,不重复的经过每一个点。
求出最短路径(距离为两点间直线距离)。
f [i ][j ] 表示点 1~max(i,j) 已走过,的路径长度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
const int N =1004;
int n;
int x[N],y[N];
double f[N][N];
double d(int i,int j){
return sqrt((x[i]-x[j])*(x[i]-x[j])+
(y[i]-y[j])*(y[i]-y[j]));
}
void solve(){
int i,j;
memset(f,0,sizeof f);
for(i=1;i<=n;i++)
scanf("%d %d",&x[i],&y[i]);
for(i=1;i<n-1;i++)
f[n-1][i] =d(n-1,n)+d(i,n);
for(i=n-2;i>=1;i--){
for(j=i-1;j>=1;j--){
f[i][j]=min(f[i+1][j]+d(i,i+1),
f[i+1][i]+d(j,i+1));
}
}
printf("%.2lf\n",f[2][1]+d(2,1));
}
signed main(){
while(scanf("%d",&n)==1) solve();
}
浙公网安备 33010602011771号