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

标签 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;
}

最佳答案

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

或者,您可以使用 typedef:

typedef struct
{
    int x, y;
} Point;

关于c - 两点之间的最短距离。蛮力算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839089/

相关文章:

c++ - `#define` 宏中的 pragma 以禁用警告

c - 如何获取unsigned char的每一位的值?

c# - 从自然数中选择一个数 < n 排除一种可能性

algorithm - 图形中是否有类似于mipmaps的数据存储模式?

c++ - 模数最接近零

c++ - Serial.println() 在哪里定义..?我可以查看它的源代码吗?

c - 优化 C 中的冒泡排序,这将减少按升序对数字列表进行排序所需的交换次数

algorithm - 查找光线是否与体素相交而不行进

java - 在 2 个排序数组(每个数组中有 1 个值)中找到值对,其中总和最接近目标值

python - 获取每个象限最近点的快速方法