java学习(10):求最接近点对问题

  1 import java.util.ArrayList;
  2 import java.util.Collections;
  3 import java.util.List;
  4 import java.util.Scanner;
  5
  6 public class Main {
  7
  8     public static void main(String[] args) {
  9         Scanner scanner = new Scanner(System.in);
 10         int N = -1;
 11         while (N != 0) {
 12             N = scanner.nextInt();
 13             List<Point> points = new ArrayList<>();
 14             for (int i = 0; i < N; i++) {
 15                 Point point = new Point();
 16                 point.setX(scanner.nextDouble());
 17                 point.setY(scanner.nextDouble());
 18                 points.add(point);
 19             }
 20             if(N!=0){
 21                 double min = MinDistance(points);
 22                 System.out.printf("%.2f", min);
 23             }
 24         }
 25     }
 26
 27     public static double MinDistance(List<Point> points) {
 28         int n = points.size();
 29         if (n < 2)
 30             return Integer.MAX_VALUE;
 31         if (n == 2) {
 32             double distance = Distance(points.get(0), points.get(1));
 33             return distance;
 34         }
 35         Collections.sort(points);// 将点按照x坐标排好
 36         // 分界线为中间两点x坐标的一半
 37         double m = (points.get(points.size() / 2 - 1).getX() + points.get(points.size() / 2).getX()) / 2;
 38         // 以x = m 为界限分为两个点集
 39         List<Point> leftPoints = new ArrayList<>();
 40         List<Point> rightPoints = new ArrayList<>();
 41         leftPoints.addAll(points.subList(0, points.size() / 2));
 42         rightPoints.addAll(points.subList(points.size() / 2, points.size()));
 43         // 得到左右两个点集的最短距离
 44         double leftMin = MinDistance(leftPoints);
 45         double rightMin = MinDistance(rightPoints);
 46
 47         // 得到最短距离
 48         double min = Math.min(leftMin, rightMin);
 49
 50         // 创建P1点集和P2点集
 51         List<Point> P1 = new ArrayList<>();
 52         List<Point> P2 = new ArrayList<>();
 53         for (Point point : points) {
 54             if (point.getX() >= (m - min) && point.getX() < m) {
 55                 P1.add(point);
 56             }
 57             if (point.getX() > m && point.getX() <= m + min) {
 58                 P2.add(point);
 59             }
 60         }
 61
 62         double min2 = Integer.MAX_VALUE;
 63         double distance;
 64         boolean flag1, flag2;
 65         if (P1 != null && P2 != null) {
 66             for (Point point : P1) {
 67                 for (Point point2 : P2) {
 68                     flag1 = (point2.getY() >= (point.getY() - min) && point2.getY() <= point.getY());
 69                     flag2 = (point2.getY() >= point.getY() && point2.getY() <= (point.getY() + min));
 70                     if (flag1 || flag2) {
 71                         distance = Distance(point,point2);
 72                         if (distance < min2) {
 73                             min2 = distance;
 74                         }
 75
 76                     }
 77                 }
 78             }
 79             return Math.min(min, min2);
 80         } else {
 81             return min;
 82         }
 83     }
 84
 85     public static double Distance(Point point1,Point point2){
 86         return Math.sqrt((point1.getX() - point2.getX()) * (point1.getX() - point2.getX())
 87                 + (point1.getY() - point2.getY()) * (point1.getY() - point2.getY()));
 88     }
 89 }
 90
 91 class Point implements Comparable<Point> {
 92     // 点的x.y坐标
 93     private double x;
 94     private double y;
 95
 96     public void setX(double x) {
 97         this.x = x;
 98     }
 99
100     public void setY(double y) {
101         this.y = y;
102     }
103
104     public double getX() {
105         return x;
106     }
107
108     public double getY() {
109         return y;
110     }
111
112     @Override
113     public String toString() {
114         return "("+x+","+y+")";
115     }
116     @Override
117     public int compareTo(Point o) {
118         if (x > o.getX())
119             return 1;
120         else if (x == o.getX()) {
121             return 0;
122         } else {
123             return -1;
124         }
125     }
126 }
时间: 2024-08-29 00:26:23

java学习(10):求最接近点对问题的相关文章

万树IT:java学习10个小计划

零基础学Java只要方法得当,依然有机会学习好Java编程.初学Java就像交朋友从陌生到熟悉再到铁杆搭档一生相伴,随着学习的深入,你会发现学Java并不是想象的那样枯燥和困难,甚至还有一些美妙之感,这是在拥有强大的技术和出色的设计思想后才能体会的.俗话说"罗马城不是一天建成的"Java的这种境界也不是一朝一夕可以实现的,但作为初学者可以通过制定一些合理清晰的学习计划,在帮你屡清楚思路的同时还能有效提高学习效率. [计划一]透彻理解面向对象 初学Java就像交朋友从陌生到熟悉再到铁杆搭

Java学习10——package和import

package和import语句 为了便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间,使用时,import引入相应package包. 使用步骤一: package语句作用于Java源文件的第一条语句,指明该文件中定义的类所在的包.(若缺省该语句,则指定为无名包).如果想将一个类放入包中,在这个类的源文件第一句代码写package语句 格式:package xxx.xxx.xxx[.xxx......] 使用步骤二: Java

java学习日记-基础-随机数组的求余运算

时间是2017年5月6日,青年节刚过,坐标上海,沪漂2个月. 就这样简短地开始吧.                                by:slowcity [案例分析1] 要求定义一个int 型数组a,包含100 个元素,保存100个随机的4 位数.再定义一个int 型数组b,包含10 个元素.统计a 数组中的元素对10 求余等于0 的个数,保存到 b[0]中:对10 求余等于1 的个数,保存到b[1]中,--依此类推 一般看到这类的最基本的思路:1先建立一个含数组存随机四位数 2

10/27-11/2 java学习总结

   10/27-11/2 java学习总结 File类 1.通过File类打开一个文件 . 2.通过字节流或字符流的子类指定输出位置. 3.经行读写操作. 4..关闭输入输出. file中的主要方法和常见变量 java io 字节流: 字节流以操作byte类型数据为主,主要操作类为OutputStream类和InputSream类. 1.字节输出流OutputStream是整个IO包中字节输出流最大父类, 2.字节输入流InputSream为抽象类,需依靠子类 字符流 相同点 字符输出流Wri

java学习笔记8--接口总结

接着前面的学习: java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note8.html,转载请注明源地址. 生活中的接口: 什么是接口? 一个Java接口是一些方法特

Java学习日记(一)基础

标识符: 由26个英文字母大小写,数字:0-9 符号:_ $ 组成 定义合法标识符规则: 1.数字不可以开头. 2.不可以使用关键字. 3.Java中严格区分大小写. Java中的注释格式: 单行注释: 格式: //注释文字 多行注释: 格式: /* 注释文字*/ 文档注释: 格式:/** 注释文字 */ 常量: 常量表示不能改变的数值. java中常量的分类: 1.整数常量.所有整数 2.小数常量.所有小数 3.布尔型常量.较为特有,只有两个数值.true 和false. 4.字符常量.将一个

(转)如何学习Java技术?谈Java学习之路

51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领域其他技能的学习. [在原先<学好Java之我见>的基础上重新整理而成] Java - 近10年来计算机软件发展过程中的传奇,其在众多开发者心中的地位就如“屠龙刀”.“倚天剑”. Java是个平台,我只想说说我对学好Java的一点看法,希望对初学者有所帮助. 1. 思考一下 学习Java之前,先别

java学习总结——你的前世今生

一.背景 JAVA语言最開始仅仅是Sun电脑(Sun MicroSystems)公司在1990年12月開始研究的一个内部项目. Sun电脑公司的一个叫做帕特里克·诺顿的project师被公司自己开发的C++和C语言编译器搞得焦头烂额,由于当中的API极其难用.帕特里克决定改用NeXT.同一时候他也获得了研究公司的一个叫做"Stealth计划"的项目的机会. 在这个项目中,团队最初考虑使用C++语言.可是非常多成员包含Sun的首席科学家比尔?乔伊,发现C++和可用的API在某些方面存在非

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

java学习中,面向对象的三大特性:封装.继承.多态 以及 super关键字和方法的重写(java 学习中的小记录) 作者:王可利(Star·星星) 封装     权限修饰符:public 公共的,private 私有的     封装的步骤:          1.使用private 修饰需要封装的成员变量.          2.提供一个公开的方法设置或者访问私有的属性              设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写 访问 通过ge

Java学习笔记(2015.7.27~7.31)

Java学习笔记(2015.7.27~7.31) Java 课堂 Java学习笔记(2015.7.27~7.31) 小技巧 常用方法 1.List另一个子类--LinkedList 2.数组的常用方法 3.排序 1.二分法查找 2.数组转换为List 3.可变参数Type ... param (了解) 1.容器Collection 2.自动拆装箱(了解) 3.JDK增强for循环(了解) 4.泛型(掌握) 5.iterator与for在迭代中的区别 1.概念:保存多个对象的对象. 2.JDk为什