openJudge | 距离排序 C语言

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

描述

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

输入

输入包括两行,第一行包含一个整数n表示点的个数,第二行包含每个点的坐标(坐标都是整数)。点的坐标的范围是0到100,输入数据中不存在坐标相同的点。

输出

对于大小为n的输入数据,输出n*(n-1)/2行格式如下的距离信息:

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

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

(用cout输出时保留到小数点后2位的方法:cout<

样例输入

复制代码
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
  1. 如果有两对点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

答案

c 复制代码
#include <stdio.h>
#include <math.h>
typedef struct {
    int start[3];
    int end[3];
    double dis;
    int weight;
} points;
int main() {
    static int n, p=0;
    static int a[10][4];
    static points point[1024], t;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
    }
    for(int i = 0; i < n; i++) {
        for(int j = i+1; j < n; j++) {
            point[p].start[0] = a[i][0];
            point[p].start[1] = a[i][1];
            point[p].start[2] = a[i][2];
            point[p].end[0] = a[j][0];
            point[p].end[1] = a[j][1];
            point[p].end[2] = a[j][2];
            point[p].dis = sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1])+(a[i][2]-a[j][2])*(a[i][2]-a[j][2]));
            point[p].weight = p;
            p++;
        }
    }
    for(int i = 0; i < p; i++) {
        for(int j = i+1; j < p; j++) {
            if(point[i].dis < point[j].dis) {
                t = point[i];
                point[i] = point[j];
                point[j] = t;
            } else if(point[i].dis == point[j].dis) {
                if(point[i].weight > point[j].weight) {
                    t = point[i];
                    point[i] = point[j];
                    point[j] = t;
                }
            }
        }
    }
    for(int i = 0; i < p; i++) {
        printf("(%d,%d,%d)-(%d,%d,%d)=%.2f\n", point[i].start[0], point[i].start[1], point[i].start[2], point[i].end[0], point[i].end[1], point[i].end[2], point[i].dis);
    }
}

至于weight,它的作用,就只是增加一个权重罢了。

相关推荐
white-persist1 小时前
【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
运维·服务器·网络·python·算法·安全·web安全
FL16238631292 小时前
基于C#winform部署软前景分割DAViD算法的onnx模型实现前景分割
开发语言·算法·c#
独小乐2 小时前
019.ADC转换和子中断|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·mcu·arm
baizhigangqw2 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶
算法·启发式算法·web app
C雨后彩虹2 小时前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
cpp_25013 小时前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
Hugh-Yu-1301233 小时前
二元一次方程组求解器c++代码
开发语言·c++·算法
编程大师哥4 小时前
C++类和对象
开发语言·c++·算法
加农炮手Jinx4 小时前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
Rabitebla4 小时前
C++ 和 C 语言实现 Stack 对比
c语言·数据结构·c++·算法·排序算法