枚举法找出距离最近的两个点

来源:互联网 发布:qt5.7串口编程实例 编辑:程序博客网 时间:2024/05/16 00:57

在编程之美和HDU有这么一道题目:

给定平面上N个点的坐标,找出距离最近的两个点。如:有这些个点对:
(-1, 3)
(-1, -1)
(1, 1)
(2, 0.5)
(2, -1)
(3, 3)
(4, 2)
(4, -0.5)
则最近的两点应该为:(1,1)和(2, 0.5)

解决的方有多种,网上参考例子最多的是分而治之的方法,今天我用最简单粗暴的枚举法来解决这道题。一来是为了最近找工作笔试练手,二来是了给亲爱的伸手党童鞋一个参考。

思路:
把每个点的横纵坐标放在N行2列的二维数组里边。每一行的第0列为点的横坐标,第1列为点的纵坐标。设立一个变量minDistance记录距离最短距离值,p1记录最短距离的起始点,p2记录最短距离的终点。从第0列开始,遍历第i个点和j个点之间的距离,如果这亮点的距离小于我们的标杆minDistance,则更新minDistance的值,并记录下i和j的下标到p1和p2中。
这里写图片描述

import java.util.Scanner;/** * 寻找最近点对 * @author shizongger * @date 2017-02-28 */public class Main {    public static void main(String[] args) {        System.out.print("请输入点对个数: ");        Scanner sc = new Scanner(System.in);        int number = sc.nextInt();        double[][] points = new double[number][number];        for(int i = 0; i < number; i++) {  //循环输入点对坐标            System.out.print("第" + (i+1) + "个点的横纵坐标:");            points[i][0] = sc.nextDouble();            points[i][1] = sc.nextDouble();        }        int p1 = 0;  //p1记录起点,假设起点就是二维数组的第一组元素        int p2 = 1;  //p2记录终点,假设终点就是二维数组的第二组元素        double minDistance = distance(points[p1][0], points[p1][1], points[p2][0], points[p2][1]);        for(int i = 0; i < points.length; i++) {            for(int j = i+1; j < points[i].length; j++) {                double dist = distance(points[i][0], points[i][1], points[j][0], points[j][1]);                //如果dis的值小于minDistance的值,则更新p1和p2的位置                if(dist < minDistance) {                    minDistance = dist;                    p1 = i;                    p2 = j;                }            }        }        System.out.println("平面内最短距离的两点是:(" + points[p1][0] + "," + points[p1][1] + ")和("                + points[p2][0] + "," + points[p2][1] + ")");    }    /**     * 计算两点之间的距离     * @param x1 第一个点的横坐标      * @param y1 第一个点的纵坐标     * @param x2 第二个点的横坐标     * @param y2 第二个点的纵坐标     * @return 两点之间的距离     */    public static double distance(double x1, double y1, double x2, double y2) {        return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));    }}

结果输入如图所示:
这里写图片描述

0 0
原创粉丝点击