openjudge 距离排序_距离排序openjudge_mach7的博客-程序员秘密

技术标签: 冒泡排序  距离排序  openjudge  内排序  

题目题目:

1:距离排序
查看 提交 统计 提问
总时间限制: 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. 交换排序的一种,还有一种更为著名的交换排序是快速排序。
  2. 冒泡排序是稳定的,即,关键字相同的记录,经过排序后仍保持排序前的顺序。
  3. 空间代价为Theta(1);平均时间代价为Theta(n^2);最差时间代价为Theta(n^2),最好时间代价为Theta(n),即只扫描一次序列发现已经是有序的了。
  4. 实现方面,每次从序列的末尾开始冒泡,最大/最小的元素上浮到尽可能靠前的位置,冒泡(n-1)次,n为序列的长度;设置NoSwap标志位,每次扫描前初始化为true,若在某次扫描过后,发现序列已经是有序的,即NoSwap保持true,退出排序算法。

代码清单:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

#define MAXN 12

struct _point
{
	int x, y, z;
} p[MAXN];

struct _dist
{
	int from, to;
	double dis;
} d[MAXN*MAXN/2];

int initPointSet()
{
	int n, a, b, c;
	scanf("%d", &n);

	for (int i=0; i<n; ++i)
	{
		scanf("%d%d%d", &a, &b, &c);
		p[i].x=a;
		p[i].y=b;
		p[i].z=c;
	}

	return n;
}

double calcDist(int from, int to)
{
	int dx=(p[from].x)-(p[to].x);
	int dy=(p[from].y)-(p[to].y);
	int dz=(p[from].z)-(p[to].z);

	return sqrt( double(dx*dx + dy*dy + dz*dz) );
}

int calcDistSet(int n)
{
	int k=0;
	for (int i=0; i<n; ++i)		//按照点的标号建立距离集合,即(0,1)...(0,9)(1,0)(1,2)...(1,9)...
	{
		for (int j=0; j<n; ++j)
		{
			if (i<j)
			{
				d[k].from=i;
				d[k].to=j;
				d[k].dis=calcDist(i, j);
				++k;
			}
		}
	}

	return k;
}

//冒泡排序是稳定的,因为每次都是相邻的元素比较。
//距离集合在建立的时候已经是按照点出现的先后顺序。
//因此,直接对距离进行一次冒泡排序即可。
void bubbleSortbyDist(int k)
{
	bool NoSwap;
	int last=MAXN*MAXN/2-1;	//用d[]数组最后一个元素作为交换所用的额外O(1)的空间。
	for (int i=0; i<k-1; ++i)	//要进行k-1次冒泡。
	{
		NoSwap=true;

		for (int j=k-1; j>i; --j)	//从队尾向队首冒泡
		{
			if ( d[j].dis>d[j-1].dis )
			{
				d[last].from=d[j].from;
				d[last].to=d[j].to;
				d[last].dis=d[j].dis;

				d[j].from=d[j-1].from;
				d[j].to=d[j-1].to;
				d[j].dis=d[j-1].dis;

				d[j-1].from=d[last].from;
				d[j-1].to=d[last].to;
				d[j-1].dis=d[last].dis;

				NoSwap=false;
			}
						
		}

		if (NoSwap==true)
		{
			return;
		}
	}
}

void printSortedDistSet(int k)
{
	for (int i=0; i<k; ++i)
	{
		int from=d[i].from;
		int to=d[i].to;
		printf("(%d,%d,%d)-(%d,%d,%d)=%.2f\n", p[from].x, p[from].y, p[from].z, p[to].x, p[to].y, p[to].z, d[i].dis);
	}
}

int main()
{
	freopen("D:\\in.txt", "r", stdin);
	freopen("D:\\out.txt", "w", stdout);

	int n, k;

	n=initPointSet();
	k=calcDistSet(n);
	bubbleSortbyDist(k);
	printSortedDistSet(k);

	return 0;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mach7/article/details/22196249

智能推荐

动态规划经典问题_lzq603的博客-程序员秘密

一、最大子序列和给定一个数组,求出其最大的子序列之和定义d[i]代表以下标为i元素的最大子序列和则d[i] = d[i-1] &gt; 0 ? d[i-1] + a[i] : a[i]算法:int maxSubArray(int* nums, int numsSize){ if(numsSize == 0) ret...

Vue之input框自动获取焦点+内容形式修改_不开花的玫瑰的博客-程序员秘密

前言  在项目开发的过程中需要用到input框,限定input框中只能输入数字,当界面一显示的时候input框获得焦点,并调起手机上的数字框。实现方式普通输入框&lt;input type="number" /&gt;获取焦点&lt;input v-focus type="number" /&gt;methods中的方法 thisFocus(){ $('#Inp...

Linux查找命令_weixin_30731287的博客-程序员秘密

最近,我在学习Linux,下面是一些笔记。使用电脑的时候,经常需要查找文件。在Linux中,有很多方法可以做到这一点。国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条。大多数程序员,可能经常使用其中的2到3条,对这5条命令都很熟悉的人应该是不多的。1. findfind是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。find的使用格式如下...

Origin绘制双Y轴图的方法_origin要绘制这种图形,您需要选择被指定为xy的列_CHCH998的博客-程序员秘密

1、已有数据绘图如下,其中网络流量的单位是M Bytes/s,与另外两组数据的单位(时间)不同,现在要为其添加右侧Y轴。2、首先选中该图像,找到工具条,点击第三个按钮“Add Right-Y La

python 字典的值变成数字_如何在Python中将字典值转换为int?_weixin_39710003的博客-程序员秘密

你几乎在那里您需要将替换后的所选值转换为整数,就像这样results = sorted(ranks, key=lambda x: int(x["rank"].replace(",", "")))例如,&gt;&gt;&gt; ranks = [... {'url': 'example.com', 'rank': '11,279'},... {'url': 'facebook.com...

物联网协同生态体系“六域模型”简述_沧海一笑-的博客-程序员秘密

物联网“六域模型”通过将纷繁复杂的物联网行业应用关联要素进行系统化梳理,以系统级业务功能划分为主要原则,设定了物联网用户域(定义用户和需求)、目标对象域(明确“物”及关联属性)、感知控制域(设定所需感知和控制的方案,即“物”的关联方式)、服务提供域(将原始或半成品数据加工成对应的用户服务)、运维管控域(在技术和制度两个层面保障系统的安全、可靠、稳定和精确的运行)、资源交换域(实现单个物联网应用系统...

随便推点

模拟实现JS( forEach)方法_划出一条大江的博客-程序员秘密

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt; function addEachMethod(obj,attrName){ obj[attrName] = function(fn) { var keys = Object.keys(this); this.fn = fn; window.newArr = []; for (var i = ...

关于https站点调用百度地图api的说明_引用https的百度地图_cangxie8的博客-程序员秘密

一般普通网站站点为http的居多,但随着HTTPS的普及推广,以及免费SSL证书的申请实现,HTTPS站点也在增加,博主开发的米云婚嫁网就是其中一个。下面是百度地图开放平台给出的一个初始化百度地图的官方示例Demo:&amp;lt;!DOCTYPE html&amp;gt;  &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;  &amp;lt;meta name=&quot;viewport&quot; content=&quot;i...

10-单点登录系统拓展实现(2105~2106)_雨田说码的博客-程序员秘密

拓展业务描述增加数据库访问第一:登录用户信息来自数据库(用户自身信息以及用户对应的权限信息)第二:将上传的文件信息写入到数据库(自己做)第三:将登录操作,文件上传操作的操作日志写入到数据库.(自己做)增加服务之间的调用第一:认证服务调用系统服务(获取用户以及用户权限)第二:认证服务与资源服务都调用系统服务(将日志传递给系统服务,进行数据的持久化)-自己做系统服务设计及实现业务描述系统服务jt-system工程用于提供,其它服务需要的基础数据,例如用户信息,日志信息的记录等,其关键表设计例

SpringBoot Admin健康检查_springboot 健康检查_骑马看象的博客-程序员秘密

Admin健康检查admin实现admin功能创建客户端主动上报的服务端实现效果异常通知邮件通知其他通知代码地址admin监控检查,检查的是什么了。检查的是应用实例状态,说白了就是被查服务提供信息给检查服务端。在spring cloud 中可以有两种方式进行健康检查,一种是应用主动上报到admin服务端,第二种就是的admin项目eureka服务端拉取信息。admin主要就是告诉运维人员,服务出现异常,然后进行通知(微信、邮件、短信、钉钉等)可以非常快速通知到运维人员,相当报警功能。应用中如果没有监控

windbg-.process切换进程(内核)_aijia1857的博客-程序员秘密

.process.process 命令指定要用作进程上下文的进程(Set Process Context).process显示当前进程的EPROCESS,这里显示当前进程为test.exe[cpp] view plain copy print?kd&gt;.processImplicitprocessisnow...

推荐文章

热门文章

相关标签