暴力法解決最近對問題和凸包問題

2021-10-10 03:03:38 字數 2583 閱讀 6503

二、凸包問題

所謂最近對問題就是在包含n個點集中,找出距離最近的兩個點。為了找出最近對,只需要分別計算每一對點之間的距離,然後找出距離最小的那一對即可。

//使用蠻力法求平面中距離最近的兩個點

//輸入:乙個n個點的集合

//輸出:最近的兩個點

d←∞for i←1 to i←n-1 do

for j←i+1 to n do

d ←min(d,sqrt((xi-xj)²+(yi-yj)²)) //sqrt是開平方函式

#include

"iostream"

#include

"time.h"

#include

"stdlib.h"

#include

"limits.h"

// 匯入最大值

#include

"math.h"

//呼叫pow函式

using namespace std;

void

tofind

(int a[10]

[2],

int length)}}

cout<<

"最近的一對點是"

<

1<<

","<

1<<

",它們的距離是"

凸包問題就是在乙個有n個點集的平面上,找出所有的「極點」,這些極點所構成的邊界能夠把其他所有的點都能包含在內。

基於「邊界包含所有的點」的思想,對於在n個點集中的兩個點pi和pj,當且僅當該集合中的其他點都位於穿過這兩點的直線的同一邊時,它們的連線是該集合凸包邊界的一部分。運用平面解析幾何的知識:

座標平面的兩個點(x1,y1),(y1,y2)可滿足直線方程:ax+by=c

於是可以得到:a=y2-y1,b=x1-x2,c=x1y2-y1x2。

所以程式的大致思路如下:

1.任意取兩個點確定一種a,b,c三個引數。

2.將每一對點代入到所確定的a,b,c中,判定ax+by>c還是ax+by

程式流程圖(偽)如下:

//儲存最後的結果

int num=0;

//統計極點數量

bool cal

(int arry[10]

[2],

int length,

int a,

int b,

int c)

//解析幾何計算

return flag1!=flag2;

//一真一假說明所有的點在同一邊

}void

tofind

(int arry[10]

[2],

int length)

else

//不是第一次,則要檢測是否有重複的點

if(result[k][0

]==arry[j][0

]&&result[k][1

]==arry[j][1

])//檢測第二個點是否重複 }if

(flag1==true)

//第乙個點不重複的話

if(flag2==true)

//第二個點不重複的話 }}

}}}int

main()

}for

(int i=

0;i<

10;i++

) cout<

}int length=

sizeof

(a)/

sizeof

(a[0])

;tofind

(a,length)

; cout<<

"構成凸包的極點座標:"

分治法解決凸包問題

問題 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,凸包問題是為集合s構造最小凸多邊形。思路設p1 x1,y1 p2 x2,y2 pn xn,yn 按照x軸座標公升序排列,則最左邊的點p1和最右邊的點p2一定是該集合的凸包頂點。如圖1所示。設p1pn是經過點p1...

凸包問題(蠻力法)

蠻力法求解凸包問題的基本思想 對於由n個點構成的集合s中的兩個點pi和pj,當且僅當該集合中的其他點都位於穿過這兩點的直線的同一邊時 假定不存在三點同線的情況 它們的連線是該集合凸包邊界的一部分。對每一對頂點都檢驗一遍後,滿足條件的線段構成了該凸包的邊界。在平面上,穿過兩個點 x1,y1 和 x2,...

分治法 凸包問題

什麼是凸包?我的理解就是,圖形任意兩點的連線都沒有在圖形外部。問題 給定點集,怎麼求出凸包的邊界點呢?第一步 給這些點按照x的從大到小進行排序,如果x相同的按照y再排序。第二步 把x最小的和最大的連起來,他們必為凸包的邊界點。第三步 把平面區域分為兩個部分,分別在上面和下面去找面積最大的三角形 面積...