我们在二维空间上输入了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