列舉法找出距離最近的兩個點
阿新 • • 發佈:2018-11-08
在程式設計之美和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));
}
}
結果輸入如圖所示: