세 영역의 가장 가까운 포인트가 발생할 수 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 이용 스페이스 성병; 6 7 CONST의 INT의 N = 100005 ; 8 9 타입 정의의 구조체 TagPoint { 10 번 X, Y; 11 INT의 인덱스; 12 } 포인트; 13 14 포인트 A [N], 2 [N], 3 [N]; 15 16 부울 cmp_x ( CONST 점 A, CONST 점 B) { 17 반환 AX < BX 단계; 18 } 19 20 부울 cmp_y ( CONST 점 A, CONST 점 B) { 21 반환 AY < 단계; 22 } 23 24 번 DIS (점 (P), 점 (Q)) { 25 번 X1은 픽셀 - QX, Y1 = PY - QY; 26 리턴 SQRT (X1에서의 * X1 + Y1의 *의 Y1); 27 } 28 29 공극 병합 (B 점 [], C 점 [], INT의 L, INT의 m, INT의 R) {//归并操作 30 INTI =의 L; 31 INT의 P1 = 1, P2에서의 m = + 1 ; 32 동안 (P1 <P2 && = m <= R) { 33 개 (B) [I ++]의 C = [P1] .Y <C [P2] .Y? C [P1 ++] C [P2 ++ ]; 34 } 35 동안 (P1 <= m) ㄴ [I ++]의 C = [(P1) ++ ]; 36 동안 (P2 <= R)의 B [I ++]의 C = [P2 ++ ]; 37 개 를 memcpy (C + L, B + 1, (R-L + 1 ) * 는 sizeof (점)); 38 } 39 40 번 (a [], B 점 [], C 점 [], 점 가까운 INT의 L, INT의 r)을 { 41 만약 (R - 패 == 1 ) 반환 DIS (a [1]을, A [R]); (42) 만약 (R - L == 2 ) { 43 번 X1 = DIS (A [1], A [R]); 44 번 X2는 DIS (a [L + 1 ], A [R]); 45 번 X3 = DIS (A [1], A [L + 1 ]); (46) 만약 (X1 <X2 && X1 <X3) 복귀 X1; (47) 그 밖의 경우 (X2 <X3) 복귀 X2; 48 다른 반환 X3; 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 = (A, 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는 <= & lt; 화학식 ++ⅰ) { 62 의 경우 (팹 (b [I] .x와 - B [미드] .x를) < DM) { 63 (C)의이 = [++ K] B가 [I]; 64 } 65 } 66 대 (! I = 1, I = K; ++ I) { (67) 에 대한 (j = 1이 + 1 ! J = K && C [J] .Y - C [I] .Y <DM; ++ J) { 68 번 온도 = DIS (c [I], C [J]); (69) 의 경우 (온도 <DM) : DM = 온도; 70 } 71 } 72 리턴 DM; 73 } 74 75 INT의 주 () { 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 }