计算二维空间中满足C ++中给定条件的三元组对(A,B,C)

我们在二维空间上输入了N个点。目的是从输入中查找点的三元组的数量,以使一个点成为另一两个点之间的直线的中点。即,如果三元组是(A,B,C),则B是A和C(或A,B,C的任何其他组合)的中点。

我们将通过将所有对成对<int,int>插入到向量中来完成此操作。然后将这个向量中的所有对相加。通过从集合中获取两个点,检查(x,y)坐标之和除以2是否在同一集合中。如果是,则增加三元组计数。

让我们通过示例来理解。

输入项 

{ 1,2 }, { 4,2} , { 2,1 } , { 7,2 } N=4 pairs

输出结果 

Count of triplet pairs that satisfy the given condition are: 1

说明 

Here {4,2} is mid-point between {1,2} and {7,2}. Only 1 such triplet

输入项 

{ 1,2 }, { 4,2} , { 2,1 } , { 5,2 }, { 8,1} , {1,1} N=6

输出结果 

Count of triplet pairs that satisfy the given condition are: 1

说明 

No such triplet exist

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

  • 我们正在获取一个<int,int>类型的对向量。

  • 每对包含(x,y)坐标。

  • 函数mid_point(vector <pair <int,int >> vec,int size)以一个向量及其大小作为输入,并返回满足中点条件的三元组数。

  • 对于此类三元组,将初始变量计数设为0。

  • 将向量中的所有对插入到set <pair <int,int>>集中。它将具有所有独特之处。

  • 对每对点使用两个for循环遍历向量。

  • 将两个点的x坐标之和存储在整数point_A中,将两个点的y坐标之和存储在整数point_B中。

  • 如果point_A和point_B中的两个总和都为偶数,则检查中点条件。

  • 如果一对(point_A / 2,point_B / 2)成对存在于集合中,则意味着存在中点。三元组的递增计数。

  • 最后,计数将包含三胞胎的数量。

  • 在for循环结束时返回计数结果。

示例

#include <bits/stdc++.h>
using namespace std;
int mid_point(vector<pair<int, int>> vec, int size){
   int count = 0;
   set<pair<int, int> > sets;
   for (int i = 0; i < size; i++){
      sets.insert(vec[i]);
   }
   for (int i = 0; i < size; i++){
      for (int j = i + 1; j < size; j++){
         int point_A = vec[i].first + vec[j].first;
         int point_B = vec[i].second + vec[j].second;
         if (point_A % 2 == 0 && point_B % 2 == 0){
            if (sets.find(make_pair(point_A / 2, point_B / 2)) != sets.end()){
               count++;
            }
         }
      }
   }
   return count;
}
int main(){
   vector<pair<int, int>> vec = { { 9, 2 }, { 5, 2 }, { 1, 2 } };
   int size = vec.size();
   cout<<"Count of triplet pairs (A, B, C) of points in 2-D space that satisfy the given condition are: "<<mid_point(vec, size);
}

输出结果

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

Count of triplet pairs (A, B, C) of points in 2-D space that satisfy the given condition are: 1