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;
}
相关文章推荐
- 【openjudge 计算概论(A)】[编程练习(数组练习)]
- openjudge 计算概论 函数与字符串练习(1)2:字符串排序
- openjudge 计算概论基础编程练习(控制成分)
- 【openjudge 计算概论(A)】[指针练习]
- 【openjudge 计算概论(A)】[ 函数与字符串练习(2)]
- 练习LINQ:同时操作二维和一维数组,把二维数组转为一维,计算一维和二维值,字符串组合,计算数组和,数组筛选,排序
- c# 程序设计及应用教程上机A.2.4————数组排序和计算练习(Console)
- 【openjudge 计算概论(A)】[结构体与链表练习]
- 初识.net界面程序(4)——数组排序和计算练习
- 【openjudge 计算概论(A)】[函数与字符串练习(1)]
- 【openjudge 计算概论(A)】[基础编程练习(控制成分)]
- Openjudge-计算概论(A)-DNA排序
- perl练习——FASTA格式文件中序列GC含量计算&perl数组排序如何获得下标或者键
- 【openjudge 计算概论(A)】[基础编程练习(运算成分)]
- 【openjudge 计算概论(A)】[基础编程练习(数据成分)]
- 【openjudge 计算概论(A)】[基础编程练习2]
- 【openjudge 计算概论(A)】[基础编程练习1]
- 【openjudge 计算概论(A)】[函数递归练习(4)]
- 【openjudge 计算概论(A)】[函数递归练习(3)]
- openjudge 计算概论-数组练习-错误侦测