用 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) 将向量及其大小作为输入,并返回满足中点条件的三元组数量。
将初始变量 count 初始化为 0,用于统计此类三元组。
将向量中的所有对插入到集合 <pair<int, int> > sets 中。它将包含所有唯一点。
使用两个 for 循环遍历向量中的每对点。
将两点的 x 坐标之和存储在整数 point_A 中,将两点的 y 坐标之和存储在整数 point_B 中。
如果 point_A 和 point_B 中这两个和都是偶数,则检查中点条件。
如果一对 (point_A/2,point_B/2) 作为对存在于集合中,则表示存在中点。递增三元组计数。
最后,count 将包含三元组的数量。
在 for 循环结束时返回 count 作为结果。
示例
#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
广告