2차원 공간에서 N개의 점을 입력받습니다. 목표는 한 점이 다른 두 점 사이의 선에서 중간 점이 되도록 입력에서 점의 세 쌍의 수를 찾는 것입니다. 즉, 삼중항이 (A,B,C)이면 B는 A와 C의 중간점입니다(또는 A,B,C의 다른 조합).
모든 점을
예를 들어 이해합시다.
입력
{ 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
아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.
-
유형의 쌍으로 구성된 벡터를 사용합니다. -
각 쌍은 (x,y) 좌표를 포함합니다.
-
함수 mid_point(vector
> vec, int size) 는 벡터와 크기를 입력으로 받아 중간점 조건을 만족하는 트리플렛의 수를 반환합니다. -
이러한 삼중항의 경우 초기 변수 개수를 0으로 간주합니다.
-
벡터의 모든 쌍을 set
> 세트에 삽입합니다. 모든 고유 포인트가 있습니다. -
각 점 쌍에 대해 두 개의 for 루프를 사용하여 벡터를 탐색합니다.
-
두 점의 x 좌표의 합을 정수 point_A에 저장하고 두 점의 y 좌표의 합을 정수 point_B에 저장합니다.
-
point_A와 point_B의 합이 모두 짝수이면 중간점 조건을 확인하십시오.
-
pair(point_A/2,point_B/2)가 set에 pair로 존재하면 중간점이 존재함을 의미한다. 트리플렛의 증분 수.
-
결국 카운트에는 세 개의 숫자가 있습니다.
-
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