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

需要求出在所有的组合中,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. .net core 3.1 在iis上的发布(踩坑)

    写这篇文章的目的是希望像我一样喜欢.net 的人在发布 core到 iis上时少走点弯路 网上找了些资料,其实实际操作比较简单,就是有几个坑很恶心 首先是你的服务器需要有core 的运行环境,安装前先 ...

  2. Flutter RenderBox指南——绘制篇

    本文基于1.12.13+hotfix.8版本源码分析. 0.大纲 RenderBox的用法 通过RenderObjectWidget把RenderBox塞进界面 1.RenderBox 在flutte ...

  3. 在终端输入npm run serve时出现npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! test_vue_0613@1.0.0 dev: 错误的解决方法

    在vscode终端使用命令 npm run serve 的时候报错 错误原因在于由于文件 node_modules 太大,在项目上传时有些人会删掉 导致我们下载的项目中缺少这个文件 在尝试把自己项目的 ...

  4. 200万年薪请不到!清华姚班到底有多牛X?

    前几天,清华大学自动化系2020年大一新生的C++作业因为太难而上了热搜,该话题在知乎上的热度一度高达 1300+ 万.  在该帖子下方,有很多关于这件事的讨论,其中很多不禁赞叹"清华太牛 ...

  5. 总结hashMap和hashtable

     在这里帮大家总结一下hashMap和hashtable方面的知识点吧: 1.  关于HashMap的一些说法:  a)  HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.Ha ...

  6. Python列表,元组,字典,字符串方法笔记

    01. 列表 1.1 列表的定义 List(列表) 是 Python 中使用 最频繁 的数据类型,在其他语言中通常叫做 数组 专门用于存储 一串 信息 列表用 [] 定义,数据 之间使用 , 分隔 列 ...

  7. Java Web之路一:过滤器(Filter)

    一.过滤器(Filter)简介 过滤器是对web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,主要可以拦截request和response 过滤器是以一种组件的形式与web程序绑定 ...

  8. mysql基本操作汇总

    1.数据库操作 (1)创建数据库 CREATE DATABASE <数据库名>; 例子: CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHAR ...

  9. 【MySQL】深入理解MySQL锁和事务隔离级别

    先看个小案例: 话不多说,上案例,先创建一个表 mysql> CREATE TABLE IF NOT EXISTS `account`( `id` INT UNSIGNED AUTO_INCRE ...

  10. python 日期、时间

    1.字符类型的时间 转为 时间数组 t1 = '2013-10-10 23:40:00'timeArray = time.strptime(t1, "%Y-%m-%d %H:%M:%S&qu ...