已知平面上若干个点的坐标。

需要求出在所有的组合中,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实现平面点最小距离的更多相关文章

  1. 算法笔记_115:算法集训之代码填空题集二(Java)

     目录 1 连续数的公倍数 2 孪生素数 3 迷宫走法 4 拍7游戏 5 排列为平方数 6 平面点最小距离 7 扑克牌排列 8 三进制转十进制 9 识别复制串 10 蔬菜价格计算   1 连续数的公倍 ...

  2. java算法集训代码填空题练习2

    1 连续数的公倍数 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4, ...

  3. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  4. Java实现 LeetCode 783 二叉搜索树节点最小距离(遍历)

    783. 二叉搜索树节点最小距离 给定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值. 示例: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: ...

  5. java实现平面4点最小距离

    已知平面上若干个点的坐标. 需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数). 比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd ...

  6. 最短路径算法之Dijkstra算法(java实现)

    前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...

  7. KDTree详解及java实现

    本文内容基于An introductory tutoril on kd-trees 1.KDTree介绍 KDTree根据m维空间中的数据集D构建的二叉树,能加快常用于最近邻查找(在加快k-means ...

  8. java版飞机大战 实战项目详细步骤.md

    [toc] 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是 ...

  9. (java项目)坦克大战 2.0

    这个版本,只能算是一个雏形,把最基本的东西给完成了,不过,后面可添加的也不多.有一点,还是想去实现,那就是敌方坦克自己寻找对手!也就是游戏AI. emmm, 什么时候可以了解一下这个AI.顺便学学py ...

随机推荐

  1. 关于日常操作中sql的性能

    最近接手了一个项目.使用的数据库是sql server,但是遇到一些关于日期的查询的时候,查询结果非常慢.看了下别人的sql //sql = sql + " and CONVERT(nvar ...

  2. 异步http接口调用库:httpx

    谈到http接口调用,Requests大家并不陌生,例如,robotframework-requests.HttpRunner等HTTP接口测试库/框架都是基于它开发.这里将介绍另一款http接口测试 ...

  3. python3.x 基础一:str字符串方法

    *字符串不能更改值 数据类型字符串str |  capitalize(...)   返回字符串中第一个字母大写 |      S.capitalize() -> str |       |    ...

  4. http://blog.itpub.net/28602568/viewspace-759789/

    varchar .varchar2.nvarchar.nvarchar2  -->存储可变的字符串 varchar .varchar2:varchar:汉字全角等字符占2字节,数字.字母均1个字 ...

  5. Mac node.js express-generator脚手架安装

    前言 由于本人在学习NodeJs的express框架时,在Mac电脑上安装express遇到了一个深痛的坑点,特写此文来记录.该坑点的解决方案我在国内的度娘没有找到,问别人也没有方案,最后通过goog ...

  6. MySQL(5)— 常用函数

    五.MySQL常用函数 可参考[官网文档]https://dev.mysql.com/doc/refman/8.0/en/ 5-1.基本函数 数学运算: -- 数学运算 SELECT ABS(-8) ...

  7. Python创建一个简单的区块链

    区块链(Blockchain)是一种分布式账本(listributed ledger),它是一种仅供增加(append-only),内容不可变(immutable)的有序(ordered)链式数据结构 ...

  8. POJ3255

    题目链接:http://poj.org/problem?id=3255 解题思路: 昨晚两点多睡不着翻起来刷<挑战>的题,结果遇到这道求次短路的题,一脸懵逼.想了半小时没什么思路就看他的解 ...

  9. 实验二、OpenCV图像滤波

    一.题目描述 对下面的图片进行滤波和边缘提取操作,请详细地记录每一步操作的步骤. 滤波操作可以用来过滤噪声,常见噪声有椒盐噪声和高斯噪声,椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点:高斯噪声 ...

  10. js 滚动条滑动

    toTop() { let top = document.documentElement.scrollTop || document.body.scrollTop; // 实现滚动效果 const t ...