两点之间的最短距离。暴力算法

时间:2013-02-12 18:18:06

标签: c algorithm closest closest-points

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

算法是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;
}

2 个答案:

答案 0 :(得分:4)

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

或者,您可以使用typedef

typedef struct
{
    int x, y;
} Point;

答案 1 :(得分:1)

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