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

更新於: 2020-08-17

163 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.