C++ 中计算总点数为 n,共线点数为 m 的三角形数量


给定两个变量 n 和 m,分别表示二维平面上点的数量。在 n 个点中,有 m 个点共线。目标是找到可以使用这些 n 个点形成的三角形的数量。

共线点 - 位于同一条直线上的点称为共线点。点 A 和 B 是共线点。

给定 n=4 (A,B,C,D ),m=2 (A,B)

三角形数量 -

从 4 个点中选择任意 3 个点 = 4C3

但共线点不能形成三角形,因此删除上面计算中将计入的可能三角形 = 2C3

三角形总数 = 4C3 - 2C3 = 4 - 0 = 4 (ABC, ACD, BCD, ABD)

对于 n 和 m = nC3 - mC3

让我们通过示例来理解。

输入 - n=5,m=3

输出 - 总点数为 n,共线点数为 m 的三角形数量为 - 9

解释 - 三角形总数 = 5C3 - 3C3 = 10 - 1 = 9

输入 - n=10,m=5

输出 - 总点数为 n,共线点数为 m 的三角形数量为 - 110

解释 - 三角形总数 = 10C3 - 5C3 = 120 - 10 = 110

下面程序中使用的算法如下

我们将创建一个帕斯卡三角形来包含组合的计算。每一行都是使用上一行列的加法计算的。

  • 将变量 n 和 m 作为输入,表示点的数量。

  • 函数 collinear_points(int n,int m) 获取 n 和 m 并返回总点数为 n,共线点数为 m 的三角形数量。

  • 设置 count = check(n, 3) - check(m, 3); (用于计算 nC3 - mC3)

  • 函数 check(int n, int r) 获取 n 和 r 并返回 nCr 的值

  • 获取一个长度为 r+1 的数组 arr。

  • 使用 memset 将整个数组设置为 0。

  • 设置 arr[0] = 1。

  • 使用两个 for 循环,从 i=0 到 i<=n。以及 j=min (i,r) 到 j>0 计算帕斯卡三角形为 arr[j]=arr[j]+arr[j-1]。

  • 最后我们将得到 arr[r] 作为 nCr。返回它。

  • 在 check() 函数结束之后。我们将获得三角形的数量

  • 返回 count 作为结果。

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
int check(int n, int r){
   int arr[r+1];
   memset(arr, 0, sizeof(arr));
   arr[0] = 1;
   for (int i = 1; i <= n; i++){
      for (int j = min(i, r); j > 0; j--){
         arr[j] = arr[j] + arr[j-1];
      }  
   }
   return arr[r];
}
int collinear_points(int n,int m){
   int count = check(n, 3) - check(m, 3);
   return count;
}
int main(){
   int n = 6, m = 2;
   cout<<"Count of triangles with total n points with m collinear are: "<< collinear_points(n, m);
   return 0;
}

输出

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

Count of triangles with total n points with m collinear are: 20

更新于: 2020-12-03

123 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告