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

需要求出在所有的组合中,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. Centos ps命令

    输出格式(ps -aux) USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND VSZ:占用的虚拟内存大小() RSS: COMMAND: 执 ...

  2. Apache Hudi典型应用场景知多少?

    1.近实时摄取 将数据从外部源如事件日志.数据库提取到Hadoop数据湖 中是一个很常见的问题.在大多数Hadoop部署中,一般使用混合提取工具并以零散的方式解决该问题,尽管这些数据对组织是非常有价值 ...

  3. mysql安装之后需要调的参数

    http://www.mysqlperformanceblog.com/2014/01/28/10-mysql-settings-to-tune-after-installation/ 翻译加深理解. ...

  4. 「雕爷学编程」Arduino动手做(11)——金属触摸模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  5. bzoj1497最大闭权图基础题

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5485  Solved: 2661[Submit][Status] ...

  6. HDU4315 Climbing the Hill

    题目链接:https://cn.vjudge.net/problem/HDU-4315 知识点: 博弈论 题目大意: \(Alice\) 和 \(Bob\) 轮流指挥 \(N\) 个人爬山,这 \(N ...

  7. Poj2109 (1) k^n = p.

    看到1<=p<10101 ,就去想大数操作了,后来看了discuss原来double完全可以放. 类型          长度 (bit)           有效数字          ...

  8. 第二篇-用Flutter手撸一个抖音国内版,看看有多炫

    前言 继上一篇使用Flutter开发的抖音国际版 后再次撸一个国内版抖音,大部分功能已完成,主要是Flutter开发APP速度很爽,  先看下图 项目主要结构介绍 这次主要的改动在api.dart 及 ...

  9. MySQL的日期类型

    -- MySQL 中有多种数据类型可以用于日期和时间的表示,不同的版本可能有所差异,表 3-2 中-- 列出了 MySQL 5.0 中所支持的日期和时间类型.-- 表 3-2 MySQL 中的日期和时 ...

  10. SpringCloud(二)- Consul介绍、安装、使用

    唯能极于情,故能极于剑有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正,期待和大家一起学习交流 此文由四部分组成(Consul简介.安装.实操.总结),别着急,慢 ...