题解:P5143 攀爬者

· · 题解

解题思路:

首先要确定经过这些点的先后顺序,因为必须从最低到最高依次经过,所以需要按高度对所有点进行排序;然后按照排好的顺序,计算每相邻两个点之间的直线距离,再把这些距离全部加起来,得到的就是总距离。

AC Code:

#include<bits/stdc++.h>
using namespace std;
// 定义结构体node,用于存储三维空间中点的坐标信息
struct node{
    int x,y,z;  //分别表示点的x坐标、y坐标和z坐标(高度)
}p[50000];  //声明一个node类型的数组p,最多可存储50000个点
//定义比较函数cmp,用于排序时按照点的z坐标(高度)从小到大排序
bool cmp(node a,node b){
    return a.z<b.z;  //当a的z值小于b的z值时,a排在b前面
}
int main(){
    int n;  //声明变量n,用于存储点的数量
    cin>>n;  //从标准输入读取点的数量n
    //循环读取n个点的坐标信息,存储到数组p中
    for(int i=0;i<n;i++)
        cin>>p[i].x>>p[i].y>>p[i].z;  //依次读取每个点的x、y、z坐标
    // 对数组p中的n个点按照z坐标从小到大进行排序
    sort(p,p+n,cmp);
    double s=0;  //双精度浮点型变量s,用于累加总距离,初始值为0
    //循环计算排序后相邻两个点之间的距离,并累加到s中
    for(int i=1;i<n;i++){
        //计算当前点与前一个点在x方向上的差值
        double dx=p[i].x-p[i-1].x;
        //计算当前点与前一个点在y方向上的差值
        double dy=p[i].y-p[i-1].y;
        //计算当前点与前一个点在z方向上的差值
        double dz=p[i].z-p[i-1].z;
        //根据三维空间两点间距离公式计算距离,并累加到总距离s中
        s+=sqrt(dx*dx+dy*dy+dz*dz);
    }   
    //输出总距离,保留3位小数
    cout<<fixed<<setprecision(3)<<s<<endl;
    return 0;
}