三つの領域の最も近い点が発生することがあります。SL、SR、LをDが距離SLのSRに最も近い点である両側(LD〜のL + D)の
出典:https://www.cnblogs.com/AdaByron/archive/2011/10/07/2200966.html
次のコードを参照してhttps://blog.csdn.net/u011523796/article/details/41593511
1つの#include <アルゴリズム> 2の#include <cstdioを> 3の#include <cmath> 4の#include <CStringの> 5 使って 名前空間STDを、 6 7 のconst int型 N = 100005 。 8 9のtypedef 構造体TagPoint { 10 ダブルX、Y。 11 int型のインデックス。 12 }ポイント。 13 14 ポイント[N]、B [N]、[N] C。 15 16 ブール cmp_x(CONST A点、CONST B点){ 17 リターン斧< BX。 18 } 19 20 ブール cmp_y(CONST A点、CONST B点){ 21 リターン AY < によって、 22 } 23の 24 二重DIS(点P、点Q){ 25 ダブル X1 = PX - QX、Y1 = PY - QY。 26 リターン SQRT(×1 *×1 + Y1の*のY1)。 27 } 28 29 空隙マージ(点B []、点C []、INT L、INT M、INT R){//归并操作 30 INTI =のL。 31 INT P1 = L、P2 = M + 1 。 32 一方(P1 <= M && P2 <= R){ 33件の B [I ++] = Cの[P1] .Y <C [P2] .Y?C [P1 ++]:C [P2 ++ ]; 34 } 35 ながら(P1 <= M)B [I ++] = Cの[P1 ++ ]。 36 一方(P2 <= r)はB [I ++] = Cを[P2 ++ ]。 37件 のmemcpy(C + L、B + L、(R-L + 1)* はsizeof (ポイント))。 38 } 39 40 二重([]、点B []、点C []、ポイント最も近い整数の L、int型r)を{ 41 もし(R - Lの== 1)を返すDIS([L]を、[R])。 42 であれば(R - L == 2 ){ 43 ダブル X1 = DIS([L]、[R])。 44 二重 X2 = DIS([L + 1 ]、[R])。 45 二重 X3 = DIS([L]、[L + 1 ])。 46 もし(X1 <X2 && X1 <X3)リターン×1。 47 他に あれば(X2 <X3)リターン×2。 48 他の リターン×3。 49 } 50 INT半ば=(L + R)/2 ; 51である int型、J、K I; 52である ため(L = I、J = L、K + = MID 。1 ; I <= R&LT ++ {I) 53が IF(B [I] .INDEX <= MID)C 【Jは++] = B [I]; 54である 他 C [K ++] = B [I]; 55 } 56が ダブル D1 = 最寄り(、C、B、L、MID); //操作が「b値意志「C削減Bを通るようにライン60の変化; 57は、 ダブル D2 =最寄り(A、C、B、MID + 。1 ;、R&LT) 58 ダブル DM = 分(D1、D2); 59 60 マージ(B、C、L 、MID、R&LT) 61がある ため(I = L、Kが= L、Iは<= R&LT; ++I){ 62 であれば(ファブ(B [i]は.X - [中間] .X B)< DM){ 63個の C [kは++] =のB [i]は、 64 } 65 } 66 のために(!I = 1; I = K; ++ I){ 67 のための(j = iは+ 1!; J = K && C [J] .Y - C [i]は.Y <DM。 ++ J){ 68 ダブル TEMP = DIS(C [I]、C [J])。 69 であれば(温度<DM)DM = TEMP。 70 } 71 } 72 リターンDM。 73 } 74 75 int型のmain(){ 76 INT N-; 77 ながら(scanfの(" %のD "、およびN-)== 1個の && N-){ 78 のために(int型 I = 0、= N-I ;! ++ I){ 79 scanfの(" %% LF LF "、&A [I] .X、&A [I] .Y); 80 } 81 ソート(A、A + N-、cmp_x); 82 用(INT I = 0、I = N- ;! ++ I){ 83 A [ I] .INDEX = I; //点aを保存横後昇順に配列されている 84 } 85 のmemcpy(B、A、はsizeof (A))、 86 ソート(B、B + 昇順// B座標点メモリに配置された、N-、cmp_y) 87 のprintf(" %.2lf \ N- "最も近い(A 、B、C、0、N- 1)/ 2 ); 88 } 89 リターン 0 ; 90 }