Computer >> Máy Tính >  >> Lập trình >> C ++

Đếm các cặp bộ ba (A, B, C) của các điểm trong không gian 2-D thỏa mãn điều kiện cho trước trong C ++

Chúng tôi được cung cấp đầu vào của N điểm trên không gian 2-D. Mục đích là để tìm số bộ ba điểm từ đầu vào sao cho một điểm là điểm giữa trên đoạn thẳng giữa hai điểm còn lại. tức là nếu bộ ba là (A, B, C) thì B là trung điểm của A và C (hoặc bất kỳ kết hợp nào khác của A, B, C).

Chúng ta sẽ thực hiện việc này bằng cách chèn tất cả các điểm dưới dạng cặp vào một vectơ. Sau đó, thêm tất cả các cặp từ vectơ này vào bộ. Bằng cách lấy hai điểm từ tập hợp, hãy kiểm tra xem tổng tọa độ (x, y) chia cho 2 có tồn tại trong cùng một tập hay không. Nếu có, số lượng tăng gấp ba lần.

Hãy cùng hiểu với các ví dụ.

Đầu vào

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

Đầu ra

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

Giải thích

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

Đầu vào

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

Đầu ra

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

Giải thích

No such triplet exist

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Chúng tôi đang lấy một vectơ gồm các cặp kiểu .

  • Mỗi cặp chứa (x, y) tọa độ.

  • Hàm mid_point (vectơ > vec, int size) nhận một vectơ và nó có kích thước làm đầu vào và trả về số bộ ba thỏa mãn điều kiện điểm giữa.

  • Lấy số lượng biến ban đầu là 0 cho các bộ ba như vậy.

  • Chèn tất cả các cặp từ vectơ vào một bộ >. Nó sẽ có tất cả các điểm độc đáo.

  • Di chuyển vectơ bằng cách sử dụng hai vòng lặp for cho mỗi cặp điểm.

  • Lưu trữ tổng tọa độ x của cả hai điểm trong số nguyên point_A và tổng tọa độ y của cả hai điểm trong số nguyên point_B.

  • Nếu cả hai tổng này trong point_A và point_B đều bằng nhau thì hãy kiểm tra điều kiện giữa điểm.

  • Nếu một cặp (point_A / 2, point_B / 2) tồn tại dưới dạng một cặp trong tập hợp có nghĩa là tồn tại điểm giữa. Số lượng tăng lên của sinh ba.

  • Cuối cùng, số lượng sẽ có số sinh ba.

  • Trả về kết quả là kết quả ở cuối vòng lặp for.

Ví dụ

#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);
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra kết quả sau -

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