您的位置:首页 > 运维架构

openjudge 计算概论-数组练习-距离排序

2014-01-29 10:53 681 查看



5:距离排序

总时间限制: 1000ms 内存限制: 65536kB

描述给出三维空间中的n个点(不超过10个),求出n个点两两之间的距离,并按距离由大到小依次输出两个点的坐标及它们之间的距离。

输入输入包括两行,第一行包含一个整数n表示点的个数,第二行包含每个点的坐标(坐标都是整数)。点的坐标的范围是0到100,输入数据中不存在坐标相同的点。输出对于大小为n的输入数据,输出n*(n-1)/2行格式如下的距离信息:

(x1,y1,z1)-(x2,y2,z2)=距离

其中距离保留到数点后面2位。

(用cout输出时保留到小数点后2位的方法:cout<<fixed<<setprecision(2)<<x)样例输入
4
0 0 0 1 0 0 1 1 0 1 1 1

样例输出
(0,0,0)-(1,1,1)=1.73
(0,0,0)-(1,1,0)=1.41
(1,0,0)-(1,1,1)=1.41
(0,0,0)-(1,0,0)=1.00
(1,0,0)-(1,1,0)=1.00
(1,1,0)-(1,1,1)=1.00

提示用cout输出时保留到小数点后2位的方法:cout<<fixed<<setprecision(2)<<x

注意:

冒泡排序满足下面的性质,选择排序和快速排序(qsort或sort)需要对下面的情况进行额外处理

使用冒泡排序时要注意边界情况的处理,保证比较的两个数都在数组范围内

1. 对于一行输出中的两个点(x1,y1,z1)和(x2,y2,z2),点(x1,y1,z1)在输入数据中应出现在点(x2,y2,z2)的前面。

比如输入:

2

0 0 0 1 1 1

输出是:

(0,0,0)-(1,1,1)=1.73

但是如果输入:

2

1 1 1 0 0 0

输出应该是:

(1,1,1)-(0,0,0)=1.73

2. 如果有两对点p1,p2和p3,p4的距离相同,则先输出在输入数据中靠前的点对。

比如输入:

3

0 0 0 0 0 1 0 0 2

输出是:

(0,0,0)-(0,0,2)=2.00

(0,0,0)-(0,0,1)=1.00

(0,0,1)-(0,0,2)=1.00

如果输入变成:

3

0 0 2 0 0 1 0 0 0

则输出应该是:

(0,0,2)-(0,0,0)=2.00

(0,0,2)-(0,0,1)=1.00

(0,0,1)-(0,0,0)=1.00

主要思想:用结构体记录每段距离的两个点和长度!因为用数组记录的话,无法保留两个点的信息。

#include <stdio.h>

#include <stdlib.h>

#include<math.h>

#define N 100

struct DIST //初始化一个结构

{

int n1;

int n2;

float length;

};

int main()

{

int point[10][3],n,i,j,k=0,t1,t2;

struct DIST temp; //定义一个临时结构,交换距离大小次序用得到

struct DIST distance
;

scanf("%d",&n);

for(i=0; i<n; i++)

for(j=0; j<3; j++)

scanf("%d",&point[i][j]);

for(i=0; i<n-1; i++)

for(j=(i+1); j<n; j++) //调用结构,计算两个点的距离,

{

distance[k].n1=i;

distance[k].n2=j;

distance[k].length=sqrt(pow((point[i][0]-point[j][0]),2)+pow((point[i][1]-point[j][1]),2)+pow((point[i][2]-point[j][2]),2));

k++;

}

for(i=0; i<k-1; i++)

for(j=(i+1); j<k; j++) //冒泡排序

{

if(distance[i].length>=distance[j].length) //要用>=而不是<,<会破坏原有顺序,题目说“如果有两对点p1,p2和p3,p4的距离相同,则先输出在输入数据中靠前的点对。”

{

temp=distance[j]; //结构是可以相等的

distance[j]=distance[i];

distance[i]=temp;

}

}

for(i=k-1; i>=0; i--)

{

t1=distance[i].n1;

t2=distance[i].n2;

printf("(%d,%d,%d)-(%d,%d,%d)=%.2f\n",point[t1][0],point[t1][1],point[t1][2],point[t2][0],point[t2][1],point[t2][2],distance[i].length);

}

return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: