Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 라인의 최대 포인트

<시간/>

2D 평면이 있다고 가정합니다. 같은 직선에 있는 최대 점의 수를 찾아야 합니다. 따라서 포인트가 다음과 같은 경우 -

C++에서 라인의 최대 포인트

그리고 4점이 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • n :=포인트 수, n <3이면 n

    를 반환합니다.
  • 답변 :=2

  • 범위 1에서 n – 1까지의 i에 대해

    • 개수 :=0

    • 인덱스 i와 i에서 두 점을 가져옵니다 – 1, 이들은 p1, p2

    • p1과 p2 포인트가 같으면

      • 0 ~ n – 1 범위의 j에 대해

        • Points[j].x =p1.x이고 points[j].y =p1.y이면 개수를 1로 늘립니다.

    • 그렇지 않으면 -

      • 0 ~ n – 1 범위의 j에 대해

        • p3 :=인덱스 j의 포인트

        • p3.y – p2.y * p2.x – p1.x =p2.y – p1.y * p3.x – p2.x이면 카운트를 1 증가

    • ans :=ans 및 count의 최대값

  • 반환

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   int maxPoints(vector<vector<int>>& points) {
      int n = points.size();
      if(n<3)return n;
      int ans = 2;
      for(int i = 1;i<n;i++){
         int count = 0;
         lli x1 = points[i-1][0];
         lli x2 = points[i][0];
         lli y1 = points[i-1][1];
         lli y2 = points[i][1];
         if(x1 == x2 && y1 == y2){
            for(int j =0;j<n;j++){
               if(points[j][0] ==x1 && points[j][1] == y1)count++;
            }
         } else {
            for(int j =0;j<n;j++){
               int x3 = points[j][0];
               int y3 = points[j][1];
               if((y3-y2)*(x2-x1) == (y2-y1)*(x3-x2))count++ ;
            }
         }
         ans = max(ans, count);
      }
      return ans;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{1,1},{3,2},{5,3},{4,1},{2,3},{1,4}};
   cout << (ob.maxPoints(v));
}

입력

[{1,1},{3,2},{5,3},{4,1},{2,3},{1,5}]

출력

4