链接:https://ac.nowcoder.com/acm/problem/15592
来源:牛客网
题目描述
这个问题很简单,有n个三维点(x,y,z),要求按照它们距离原点的距离来排序,若距离相等,则按照x的顺序递增,若x也相等,则按照y递增的顺序递增(依次类推,不会输入重复点)
输入描述:
第一行输入一个正整数n(1<=n<=10^7),表示有n个三维点
随后n行,每行包含3个实数x,y,z表示一个点的坐标(均在double类型内)。
输出描述:
按照排序之后的结果,每行输出一个三维点的x y z方向的坐标,两个数之间以一个空格分隔
示例1
输入
4
0 0 0
1 1 1
3 3 3
-2 -2 -2
输出
0 0 0
1 1 1
-2 -2 -2
3 3 3
#include <bits/stdc++.h>
using namespace std;
const int N=1e7+10;
struct px
{
int x;
int y;
int z;
int sum;
} s[N];
bool cmp(px l,px r)
{
if(l.sum==r.sum)
{
if(l.x==r.x)
{
if(l.y==r.y)
{
return l.z<r.z;
}
return l.y<r.y;
}
return l.x<r.x;
}
return l.sum<r.sum;
}
int main(void)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i].x>>s[i].y>>s[i].z;
s[i].sum=sqrt(pow(s[i].x,2)+pow(s[i].y,2)+pow(s[i].z,2));
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
cout<<s[i].x<<" "<<s[i].y<<" "<<s[i].z<<endl;
}
如有问题,欢迎在评论区提问