java实现平面点最小距离
已知平面上若干个点的坐标。
需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。
比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。
每个点的坐标表示为:横坐标,纵坐标
坐标的取值范围是:1~1000
所有点的坐标记录在in.txt中,请读入该文件,然后计算。
注意:我们测试您的程序的时候,in.txt 可能会很大,比如包含上万条记录。
举例:
如果,in.txt 内的值为:
10,10
20,20
80,50
10,20
20,10
则程序应该输出:
11.38
请编程,读入in.txt文件,计算并输出4个点平均距离的最小值。
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
锦囊
可以用分治法。
把平面分割成4个区域。
4个区域互相可以重叠,以避免边界问题。
另一个方案:
四个区域不重合,但在所有边界上生成新区域。
总之划分,可以所有问题的规模。
import java.io.*;
import java.util.*;
public class PointDistance
{
	static class PP
	{
		public int x;
		public int y;
		public String toString()
		{
			return x + ", " + y;
		}
		public PP(int x, int y)
		{
			this.x = x;
			this.y = y;
		}
	}
	static class RR
	{
		double x1;
		double x2;
		double y1;
		double y2;
		boolean isIn(PP p)
		{
			return (x1 < p.x && p.x < x2 && y1 < p.y && p.y < y2);
		}
	}
	public static double f(List<PP> lst, double x1, double x2, double y1, double y2)
	{
		if(lst.size()<4) return 10000;
		if(lst.size()<10)
		{
			double min = 10000;
			for(int i=0; i<lst.size(); i++)
			for(int j=i+1; j<lst.size(); j++)
			for(int k=j+1; k<lst.size(); k++)
			for(int m=k+1; m<lst.size(); m++)
			{
				double d = distance(lst.get(i),lst.get(j),lst.get(k),lst.get(m));
				if( d < min ) min = d;
			}
			return min;
		}
		// ËõС±ß½ç
		double x1a = x2;
		double x2a = x1;
		double y1a = y2;
		double y2a = y1;
		for(int i=0; i<lst.size(); i++)
		{
			PP p = lst.get(i);
			if(p.x < x1a) x1a = p.x;
			if(p.x > x2a) x2a = p.x;
			if(p.y < y1a) y1a = p.y;
			if(p.y > y2a) y2a = p.y;
		}
		x1 = x1a;
		x2 = x2a;
		y1 = y1a;
		y2 = y2a;
		// ²ð·Ölst Ϊ4¿é
		RR r1 = new RR();
		RR r2 = new RR();
		RR r3 = new RR();
		RR r4 = new RR();		
		r1.x1 = x1;
		r1.y1 = y1;
		r1.x2 = x1 * 0.25 + x2 * 0.75;
		r1.y2 = y1 * 0.25 + y2 * 0.75;
		r2.x1 = x1 * 0.75 + x2 * 0.25;
		r2.y1 = y1 * 0.75 + y2 * 0.25;
		r2.x2 = x2;
		r2.y2 = y2;
		r3.x1 = x1;
		r3.y1 = y1 * 0.75 + y2 * 0.25;
		r3.x2 = x1 * 0.25 + x2 * 0.75;
		r3.y2 = y2;
		r4.x1 = x1 * 0.75 + x2 * 0.25;
		r4.y1 = y1;
		r4.x2 = x2;
		r4.y2 = y1 * 0.25 + y2 * 0.75;	
		List<PP> t1 = new Vector<PP>();
		List<PP> t2 = new Vector<PP>();
		List<PP> t3 = new Vector<PP>();
		List<PP> t4 = new Vector<PP>();
		for(int i=0; i<lst.size(); i++)
		{
			PP p = lst.get(i);
			if(r1.isIn(p)) t1.add(p);
			if(r2.isIn(p)) t2.add(p);
			if(r3.isIn(p)) t3.add(p);
			if(r4.isIn(p)) t4.add(p);
		}
		double d1 = f(t1, r1.x1, r1.x2, r1.y1, r1.y2);
		double d2 = f(t2, r2.x1, r2.x2, r2.y1, r2.y2);
		double d3 = f(t3, r3.x1, r3.x2, r3.y1, r3.y2);
		double d4 = f(t4, r4.x1, r4.x2, r4.y1, r4.y2);
		double d = d1;
		if(d2<d) d = d2;
		if(d3<d) d = d3;
		if(d4<d) d = d4;
		return d;
	}
	public static double distance(PP a, PP b, PP c, PP d)
	{
		double dis =
		(distance(a,b) + distance(a,c) + distance(a,d) +
		distance(b,c) + distance(b,d) +
		distance(c,d)) / 6.0; 
		return dis;
	}
	public static double distance(PP a, PP b)
	{
		double dx = a.x - b.x;
		double dy = a.y - b.y;
		return Math.sqrt(dx*dx + dy*dy);
	}
	public static List<PP> readPoints(String fname) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fname)));
		List<PP> lst = new Vector<PP>();
		for(;;)
		{
			String s = br.readLine();
			if(s==null) break;
			String[] ss = s.split(",");
			PP a = new PP(0,0);
			a.x = Integer.parseInt(ss[0]);
			a.y = Integer.parseInt(ss[1]);
			lst.add(a);
		}
		br.close();
		return lst;
	}
	public static void main(String[] args) throws Exception
	{
		List<PP> lst = readPoints("in.txt");
		double x = f(lst,0,1000,0,1000);
		System.out.println(x);
	}
}
												
											java实现平面点最小距离的更多相关文章
- 算法笔记_115:算法集训之代码填空题集二(Java)
		
目录 1 连续数的公倍数 2 孪生素数 3 迷宫走法 4 拍7游戏 5 排列为平方数 6 平面点最小距离 7 扑克牌排列 8 三进制转十进制 9 识别复制串 10 蔬菜价格计算 1 连续数的公倍 ...
 - java算法集训代码填空题练习2
		
1 连续数的公倍数 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4, ...
 - Spark案例分析
		
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
 - Java实现 LeetCode 783 二叉搜索树节点最小距离(遍历)
		
783. 二叉搜索树节点最小距离 给定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值. 示例: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: ...
 - java实现平面4点最小距离
		
已知平面上若干个点的坐标. 需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数). 比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd ...
 - 最短路径算法之Dijkstra算法(java实现)
		
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
 - KDTree详解及java实现
		
本文内容基于An introductory tutoril on kd-trees 1.KDTree介绍 KDTree根据m维空间中的数据集D构建的二叉树,能加快常用于最近邻查找(在加快k-means ...
 - java版飞机大战  实战项目详细步骤.md
		
[toc] 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是 ...
 - (java项目)坦克大战 2.0
		
这个版本,只能算是一个雏形,把最基本的东西给完成了,不过,后面可添加的也不多.有一点,还是想去实现,那就是敌方坦克自己寻找对手!也就是游戏AI. emmm, 什么时候可以了解一下这个AI.顺便学学py ...
 
随机推荐
- gets() 、 getchar() 、 getch() 、getche()、gets()、 scanf()的区别
			
1.getchar().getche().getch() (1).getchar 函数用于从标准输入设备键盘读入单个字符,返回表示读入字符的ASCII码值,并在屏上显示该字符:头文件是 stdio.h ...
 - Ubuntu16.04 flask + nginx + uWSGI 部署
			
前言 又有段时间没写博客了,最近一直在写外包项目,都没啥空余时间.这几天花了不少时间做项目部署,也看了不少教程,这里就记录下整个过程,也方便以后要做类似部署的时候不用再查来查去了. flask + u ...
 - python迭代器,生成器
			
1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
 - 12.1面向对象编程的介绍(oop):封装,继承,多态,访问私有属性
			
#封装:内部对数据封装.作用:1.保护数据,防止被随意修改:2.使外部的程序不需要关注内部的构造:只需要提供接口给外部进行访问即可.#继承:一个类就相当于一个模板.通过父类,子类的方式实现不同角色的共 ...
 - redis集群复制和故障转移
			
#### 一.集群的问题- 1.当某个主节点宕机后,对应的槽位没有节点承担,整个集群处于失败状态,不可用,怎么办- 2.如何判断某个主节点是否真正的岩机?- 3.如果从某个主节点的所有从节点中选举出一 ...
 - python3.x 基础三:set集合
			
集合,set(),记住: 1个特点:去重,把列表变成集合,达到自动去重操作,无序 5个关系:测试两个列表的交差并子反向差集 方法: | add(...) 常用,已存在元素去重不生效 | A ...
 - Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)
			
1.简介 上一篇中宏哥已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先宏哥给大家介绍一下如何来创建一个测试计划(Test Plan). 2.创建一个 ...
 - 【漫画】ES原理 必知必会的倒排索引和分词
			
倒排索引的初衷 倒排索引,它也是索引.索引,初衷都是为了快速检索到你要的数据. 我相信你一定知道mysql的索引,如果对某一个字段加了索引,一般来说查询该字段速度是可以有显著的提升. 每种数据库都有自 ...
 - C语言合法标识符(hud2024)
			
输入方式:先输入一个整型,再循环输入带空格的字符串. 思考:整型用scanf_s()输入.大循环输入字符串前用getchar()函数读取缓冲区的字符.然后,输入带空格的字符串就要用”gets_s()“ ...
 - shiro配置springboot的基本配置
			
标准配置 对比 https://www.cnblogs.com/xiaozhang666/p/12058341.html 的对应注入查看 package com.zys.sys.config; im ...