連線3個點的水平或垂直線段數


假設給出三個不同的點(或座標),你想找出透過連線這三個點可以構成多少條水平或垂直線段。這些線段一起也稱為多段線。你需要計算幾何的概念才能解決這個問題。在本文中,我們將討論用C++解決這個問題的各種方法。

輸入輸出場景

假設c1、c2和c3是笛卡爾平面中3個點的座標。連線這3個點的水平或垂直線段的數量如下所示。

Input: c1 = (-1, -1), c2 = (-2, 3), c3 = (4, 3)
Output: 1
Input: c1 = (1, -1), c2 = (1, 3), c3 = (4, 3)
Output: 2
Input: c1 = (1, 1), c2 = (2, 6), c3 = (5, 2)
Output: 3

注意 − 水平和垂直線段必須與座標軸對齊。

使用If語句

我們可以使用if語句來檢查三個點之間是否存在水平線或垂直線。

  • 建立一個函式,透過比較c1.xc2.xc1.xc3.x以及c2.xc3.x來檢查是否有兩個點的x座標相同。如果任何條件滿足,則意味著存在水平線段,計數器遞增。

  • 同樣,該函式透過比較c1.yc2.yc1.yc3.y以及c2.yc3.y來檢查是否有兩個點的y座標相同。如果任何條件滿足,則意味著存在垂直線段。計數器同樣遞增。

示例

#include <iostream>
using namespace std;

struct Coordinate {
   int x;
   int y;
};
int countLineSegments(Coordinate c1, Coordinate c2, Coordinate c3) {
   int count = 0;
   // Check for the horizontal segment
   if (c1.x == c2.x || c1.x == c3.x || c2.x == c3.x)
      count++; 
   // Check for the vertical segment
   if (c1.y == c2.y || c1.y == c3.y || c2.y == c3.y)
      count++; 
   return count;
}

int main() {
   Coordinate c1, c2, c3;
   c1.x = -1; c1.y = -5;
   c2.x = -2; c2.y = 3;
   c3.x = 4; c3.y = 3;

   int numSegments = countLineSegments(c1, c2, c3);

   std::cout << "Number of horizontal or vertical line segments: " << numSegments << std::endl;

   return 0;
}

輸出

Number of horizontal or vertical line segments: 1

注意 − 如果所有三個點都在笛卡爾平面的同一條軸上,即X軸或Y軸,則連線它們所需的線段數為1。如果這些點形成L形,則結果為2。否則,結果為3。

使用輔助函式

  • 在這裡,我們可以使用輔助函式(horizontalLineverticalLine)來計算線段的數量。

  • 我們使用這樣一個事實:在笛卡爾座標系中,水平線的所有點都具有相同的y座標。horizontalLine函式透過比較它們的y座標來檢查兩點是否可以形成水平線段。如果y座標相同,則存在水平線。

  • 類似地,垂直線的所有點都具有相同的x座標。verticalLine函式透過比較它們的x座標來檢查兩點是否可以形成垂直線段。如果x座標相同,則存在垂直線。

  • 接下來,我們有countLineSegments函式,它計算水平和垂直線段的數量。如果存在水平線或垂直線,則每次迭代後計數器遞增。

示例

#include <iostream>
using namespace std;

struct Coordinate {
   int x;
   int y;
};

// Helper functions
bool horizontalLine(Coordinate c1, Coordinate c2)  {
   return c1.y == c2.y;
}

bool verticalLine(Coordinate c1, Coordinate c2)  {
   return c1.x == c2.x;
}

int countLineSegments(Coordinate c1, Coordinate c2, Coordinate c3)  {
   int count = 0;
   // Check for horizontal segment
   if (horizontalLine(c1, c2) || horizontalLine(c1, c3) || horizontalLine(c2, c3))
      count++; 
   // Check for vertical segment
   if (verticalLine(c1, c2) || verticalLine(c1, c3) || verticalLine(c2, c3))
      count++; 
   return count;
}

int main() {
   Coordinate c1, c2, c3;
   c1.x = -1; c1.y = -5;
   c2.x = -2; c2.y = 3;
   c3.x = 4; c3.y = 3;

   int numSegments = countLineSegments(c1, c2, c3);

   std::cout << "Number of horizontal or vertical line segments: " << numSegments << std::endl;

   return 0;
}

輸出

Number of horizontal or vertical line segments: 1

結論

在本文中,我們探討了使用C++查詢笛卡爾平面中可以連線3個不同點的水平線和垂直線的數量的各種方法。我們討論了使用if語句解決問題的方法。但是,由於迭代次數較多,時間複雜度會增加。我們可以透過使用輔助函式有效地解決這個問題,這減少了迭代次數,從而降低了時間複雜度。

更新於:2023年7月12日

188 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.