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

版权声明:本文为张仕宗原创文章,允许转载,转载时请务必标明文章原始出处 。 https://blog.csdn.net/zhang5476499/article/details/58717812

在编程之美和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));
    }
}

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

猜你喜欢

转载自blog.csdn.net/zhang5476499/article/details/58717812