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 ...
随机推荐
- 嫌弃Apriori算法太慢?使用FP-growth算法让你的数据挖掘快到飞起
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第20篇文章,我们来看看FP-growth算法. 这个算法挺冷门的,至少比Apriori算法冷门.很多数据挖掘的教材还会 ...
- 排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法
快速排序有三大要素 分别是 第一:找基准值--key 第二:分区 第三:比较数字大小 先来看下快速排序流程: 基准值key选取了第一个元素78 基准值是可以任意一个元素 因为选择了最左边的数据,那么就 ...
- jsp 中文乱码????解决
中文乱码是个非常蛋疼的问题,在页面表单提交的时候后台获取数据变成了????,解决方案如下: 1:确认编码都是一致的如页面和后台都设置为utf-8 2:String str = new String(r ...
- 浅谈HTTP和HTTPS
HTTP和HTTPS协议 网络协议:计算机之间为了实现网络通信而达成的一种“约定”或“规则”,有了这种“约定”,不同厂商的生产设备,以及不同不同操作系统组成的计算机之间,就可以实现通信. HTTP(H ...
- 枚举:Enum-Int-String之间的转换与扩展
示例枚举: public enum Color { [Description("红色")] Red, [Description("绿色")] Green = 7 ...
- Spring Boot集成H2数据库
需求 平时学习的时候,涉及到一些连接数据库相关的操作,经常需要初始化本地数据库,比如装个MySQL,初始化一些脚本,比较麻烦,H2是内存数据库,Spring Boot可以在应用启动的时候对H2数据库初 ...
- 《机器学习_07_03_svm_核函数与非线性支持向量机》
一.简介 前两节分别实现了硬间隔支持向量机与软间隔支持向量机,它们本质上都是线性分类器,只是软间隔对"异常点"更加宽容,它们对形如如下的螺旋数据都没法进行良好分类,因为没法找到一个 ...
- postman发送请求携带Cookie
相关步骤: 1.下载 Postman-Interceptor_v0.2.24.zip插件 2.解压下载好的插件,将其拖到应用配置中 3.复制Postman-Interceptor_v中的id地址 4. ...
- D:Sequence Swapping
BaoBao has just found a strange sequence {<, >, <, >, , <, >} of length in his poc ...
- html5做webAPP界面适配总结
一.px em rem px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相 ...