0

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

该算法是该网页上的第一个算法

#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;
}
4

2 回答 2

4

Point不是有效类型。你的意思是struct Point

或者,您可以使用typedef

typedef struct
{
    int x, y;
} Point;
于 2013-02-12T18:23:34.310 回答
1

它工作得很好,输出是“最小距离是 1.414214”

于 2013-02-12T18:21:50.800 回答