1. 程式人生 > >列舉法找出距離最近的兩個點

列舉法找出距離最近的兩個點

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

結果輸入如圖所示:
這裡寫圖片描述