通过C中单个点的最大不同线

我们给定数字N和每行两个点(x1,y1)和(x2,y2)的坐标。目的是从给定的直线中找到可以通过单个点的最大直线数,以使没有两条直线相互覆盖,并且不执行旋转。

我们将线表示为(m,c)对,其中y = mx + c,m为斜率m = y2-y1 / x2-x1

给定c1!= c2,具有相同m的线是平行的。我们将计算不同的斜率(m)。对于垂直线,如果x1 = x2,则斜率= INT_MAX,否则为m。

让我们以一个例子来理解。

输入项 

Line 1 (x1,y1)=(4,10) (x2,y2)=(2,2)
Line 2 (x1,y1)=(2,2) (x2,y2)=(1,1)

输出结果 

Maximum lines: 2

说明-总线为2。两者的斜率都不同。

输入项 

Line 1 (x1,y1)=(1,5) (x2,y2)=(3,2)
Line 2 (x1,y1)=(2,7) (x2,y2)=(2,8)

输出结果 

Maximum lines: 2

说明-总线为2。两者的斜率都不同。

以下程序中使用的方法如下

  • 整数数组x1 []和x2 []用于存储线上的点的坐标。

  • 函数numLines(int x1 [],int y1 [],int x2 [],int y2 [])计算通过单个点的线数。

  • 对x1 [],y1 [],x2 [],y2 []中的每个点应用公式以计算斜率并使用k增加斜率计数。

  • 数组s []存储斜率的值。

  • 返回k作为结果的行数。

示例

#include <stdio.h>
int numLines(int n, int x1[], int y1[], int x2[], int y2[]){
   double s[10];
   int k=0;
   double slope;
   for (int i = 0; i < n; ++i) {
      if (x1[i] == x2[i])
         slope = 999;
      else
         slope = (y2[i] - y1[i]) * 1.0 / (x2[i] - x1[i]) * 1.0;
         s[k++]=slope;
   }
   return k;
}
int main(){
   int n = 2;
   int x1[] = { 1, 5 }, y1[] = { 3, 2 };
   int x2[] = { 2,7 }, y2[] = { 2, 8 };
   printf("Maximum lines: %d", numLines(n, x1, y1, x2, y2));
   return 0;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

Maximum distinct lines passing through a single point : 2