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

📅  最后修改于: 2021-04-29 08:33:37             🧑  作者: Mango

在二维空间中给定N个点。任务是计算三元组对(A,B,C)的数量,以使点B是由连接点A和C形成的线段的中点。

例子:

方法:考虑一对点AC。连接这些点的线段的中点将是((A * X + C * X)/ 2,(A * Y + C * Y)/ 2)) 。如果该点存在于给定的点列表中,则说明已找到一个三元组。为了快速检查一个点是否在我们的点列表中,我们可以使用一个集合。对所有点对执行此操作将为我们提供所需的计数。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to return the count of possible triplets
int countTriplets(int n, vector > points)
{
    set > pts;
    int ct = 0;
  
    // Insert all the points in a set
    for (int i = 0; i < n; i++)
        pts.insert(points[i]);
  
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++) {
            int x = points[i].first + points[j].first;
            int y = points[i].second + points[j].second;
  
            // If the mid point exists in the set
            if (x % 2 == 0 && y % 2 == 0)
                if (pts.find(make_pair(x / 2, y / 2))
                    != pts.end())
                    ct++;
        }
  
    // Return the count of valid triplets
    return ct;
}
  
// Driver code
int main()
{
    vector > points
        = { { 1, 1 }, { 2, 2 }, { 3, 3 } };
    int n = points.size();
    cout << countTriplets(n, points);
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG
{
      
static class pair
{
    int first,second;
  
    public pair(int first, int second) 
    {
        this.first = first;
        this.second = second;
    }
      
}
  
// Function to return the count of possible triplets
static int countTriplets(int n, Vector points)
{
    Set pts = new HashSet();
    int ct = 0;
  
    // Insert all the points in a set
    for (int i = 0; i < n; i++)
        pts.add(points.get(i));
  
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++) 
        {
            int x = points.get(i).first + points.get(j).first;
            int y = points.get(i).second + points.get(j).second;
  
            // If the mid point exists in the set
            if (x % 2 == 0 && y % 2 == 0)
                if (!pts.contains(new pair(x / 2, y / 2)))
                    ct++;
        }
  
    // Return the count of valid triplets
    return ct;
}
  
// Driver code
public static void main(String args[]) 
{
    Vector points = new Vector<>();
    points.add(new pair(1,1));
    points.add(new pair(2,2));
    points.add(new pair(3,3));
    int n = points.size();
    System.out.println(countTriplets(n, points));
}
}
  
// This code is contributed by Princi Singh


Python3
# Python3 implementation of the approach 
  
# Function to return the count 
# of possible triplets 
def countTriplets(n, points) :
      
    pts = [] 
    ct = 0; 
  
    # Insert all the points in a set 
    for i in range(n) :
        pts.append(points[i]); 
  
    for i in range(n) :
        for j in range(i + 1, n) : 
            x = points[i][0] + points[j][0]; 
            y = points[i][1] + points[j][1]; 
  
            # If the mid point exists in the set 
            if (x % 2 == 0 and y % 2 == 0) :
                if [x // 2, y // 2] in pts :
                    ct += 1
                      
    # Return the count of valid triplets 
    return ct 
  
# Driver code 
if __name__ == "__main__" :
      
    points = [[ 1, 1 ], [ 2, 2 ], [ 3, 3 ]]
    n = len(points) 
    print(countTriplets(n, points))
  
# This code is contributed by Ryuga


C#
// C# implementation of the approach
using System; 
using System.Collections.Generic; 
  
class GFG
{
      
public class pair
{
    public int first,second;
  
    public pair(int first, int second) 
    {
        this.first = first;
        this.second = second;
    }
      
}
  
// Function to return the count of possible triplets
static int countTriplets(int n, List points)
{
    HashSet pts = new HashSet();
    int ct = 0;
  
    // Insert all the points in a set
    for (int i = 0; i < n; i++)
        pts.Add(points[i]);
  
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++) 
        {
            int x = points[i].first + points[j].first;
            int y = points[i].second + points[j].second;
  
            // If the mid point exists in the set
            if (x % 2 == 0 && y % 2 == 0)
                if (!pts.Contains(new pair(x / 2, y / 2)))
                    ct++;
        }
  
    // Return the count of valid triplets
    return ct;
}
  
// Driver code
public static void Main(String []args) 
{
    List points = new List();
    points.Add(new pair(1, 1));
    points.Add(new pair(2, 2));
    points.Add(new pair(3, 3));
    int n = points.Count;
    Console.WriteLine(countTriplets(n, points));
}
}
  
// This code is contributed by 29AjayKumar


PHP


输出:
1