gpt4 book ai didi

c - 两点之间的最短距离。蛮力算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:01 25 4
gpt4 key购买 nike

<分区>

我应该使用暴力算法来确定最近的点。我无法编译它。

算法是first algorithm on this webpage .

#include <stdio.h>
#include <float.h>
#include <stdlib.h>
#include <math.h>


struct Point
{
int x, y;
};




int compareX(const void* a, const void* b)
{
Point *p1 = (Point *)a, *p2 = (Point *)b;
return (p1->x - p2->x);
}

int compareY(const void* a, const void* b)
{
Point *p1 = (Point *)a, *p2 = (Point *)b;
return (p1->y - p2->y);
}


float dist(Point p1, Point p2)
{
return sqrt( (p1.x - p2.x)*(p1.x - p2.x) +
(p1.y - p2.y)*(p1.y - p2.y)
);
}


float bruteForce(Point P[], int n)
{
float min = FLT_MAX;
for (int i = 0; i < n; ++i)
for (int j = i+1; j < n; ++j)
if (dist(P[i], P[j]) < min)
min = dist(P[i], P[j]);
return min;
}


float min(float x, float y)
{
return (x < y)? x : y;
}



float stripClosest(Point strip[], int size, float d)
{
float min = d; // Initialize the minimum distance as d

qsort(strip, size, sizeof(Point), compareY);


for (int i = 0; i < size; ++i)
for (int j = i+1; j < size && (strip[j].y - strip[i].y) < min; ++j)
if (dist(strip[i],strip[j]) < min)
min = dist(strip[i], strip[j]);

return min;
}


float closestUtil(Point P[], int n)
{

if (n <= 3)
return bruteForce(P, n);


int mid = n/2;
Point midPoint = P[mid];


float dl = closestUtil(P, mid);
float dr = closestUtil(P + mid, n-mid);


float d = min(dl, dr);


Point strip[n];
int j = 0;
for (int i = 0; i < n; i++)
if (abs(P[i].x - midPoint.x) < d)
strip[j] = P[i], j++;


return min(d, stripClosest(strip, j, d) );
}


float closest(Point P[], int n)
{
qsort(P, n, sizeof(Point), compareX);


return closestUtil(P, n);
}


int main()
{
Point P[] = {{2, 3}, {12, 30}, {40, 50}, {5, 1}, {12, 10}, {3, 4}};
int n = sizeof(P) / sizeof(P[0]);
printf("The smallest distance is %f ", closest(P, n));
return 0;
}

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com