OpenJudge-计算点的距离并排序
/*===================================================================== 距离排序 总时间限制: 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 =======================================================================*/
解析:排序练习题,注意排序要保证稳定性。

1 #include<iostream> 2 #include<cmath> 3 #include <iomanip> 4 using namespace std; 5 struct dian 6 { 7 int xx,yy,zz; 8 }; 9 struct juLi 10 { 11 dian a,b; 12 double len; 13 }; 14 int main() 15 { 16 struct dian A[12]; 17 struct juLi B[50],TEMP; 18 int n,i,j,t; 19 int flag; 20 freopen("4.in","r",stdin); 21 cin>>n; 22 for(i=0;i<n;i++) 23 { 24 cin>>A[i].xx>>A[i].yy>>A[i].zz; 25 } 26 t=0; 27 for(i=0;i<n-1;i++) 28 { 29 for(j=i+1;j<n;j++) 30 { 31 B[t].a=A[i]; 32 B[t].b=A[j]; 33 B[t].len=sqrt((B[t].a.xx-B[t].b.xx)*(B[t].a.xx-B[t].b.xx)+ 34 (B[t].a.yy-B[t].b.yy)*(B[t].a.yy-B[t].b.yy)+ 35 (B[t].a.zz-B[t].b.zz)*(B[t].a.zz-B[t].b.zz)); 36 t++; 37 } 38 } 39 40 for(i=1;i<t;i++) 41 { 42 flag=1; 43 for(j=0;j<t-i;j++) 44 { 45 if(B[j].len<B[j+1].len) 46 { 47 flag=0; 48 TEMP=B[j]; 49 B[j]=B[j+1]; 50 B[j+1]=TEMP; 51 } 52 } 53 if(flag) break; //if(flag==1) break; 54 } 55 56 for(i=0;i<t;i++) 57 { 58 cout<<'('<<B[i].a.xx<<','<<B[i].a.yy<<','<<B[i].a.zz<<')'; 59 cout<<'-'; 60 cout<<'('<<B[i].b.xx<<','<<B[i].b.yy<<','<<B[i].b.zz<<')'; 61 cout<<'='; 62 cout<<setiosflags(ios::fixed)<<setprecision(2)<<B[i].len<<endl; 63 } 64 return 0; 65 }