c_cpp 给定2D平面上的n个点,找到位于同一直线上的最大点数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定2D平面上的n个点,找到位于同一直线上的最大点数相关的知识,希望对你有一定的参考价值。
// can use map data structure to simplify codes
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <cmath>
#include <limits>
#include <algorithm>
using namespace std;
struct Point {
int x, y;
Point() : x(0), y(0) {}
Point(int a, int b) : x(a), y(b) {}
};
int maxPoints(vector<Point> &points) {
if(points.empty()) return 0;
if(points.size() == 1) return 1;
int max_num = 0;
for(int i=0; i<points.size(); i++) {
Point p1 = points[i];
unordered_map<double, int> hash;
int local_dup = 1; // 1 not 0
for(int j=0; j<points.size(); j++) {
if(i == j) continue;
Point p2 = points[j];
if(p1.x == p2.x && p1.y == p2.y) { // points overlap
local_dup++;
} else {
float slop = get_slop(p1, p2);
hash[slop]++;
}
}
int max_in_hash = 0;
for(auto p : hash)
max_in_hash = max(max_in_hash, p.second);
max_num = max(max_num, local_dup + max_in_hash);
//sort(vslop.begin(), vslop.end());
//max_num = max(max_num, local_dup + count_max_duplis(vslop));
}
return max_num;
}
float get_slop(Point p1, Point p2) {
if(p1.x == p2.x) return INT_MAX; // wrong if I wrote: return (float)numeric_limits<float>::infinity();
return (float)(p1.y - p2.y) / (p1.x - p2.x); // forgot float
}
/*
int count_max_duplis(vector<float> v) {
if(v.empty()) return 0;
int n = v.size();
if(n == 1) return 1;
int max_dup = -1;
int num = 1;
for(int i=1; i<n; i++) {
if(abs(v[i] - v[i-1]) <= 1e-5) num++; // if I wrote 1e-3, not accept!!!
else {
max_dup = max(max_dup, num);
num = 1;
}
}
max_dup = max(max_dup, num); // easy to forgot!
return max_dup;
} */
int main()
{
vector<Point> vp;
vp.push_back(Point(4,0));
vp.push_back(Point(4,-1));
vp.push_back(Point(4,5));
cout << maxPoints(vp);
return 0;
}
以上是关于c_cpp 给定2D平面上的n个点,找到位于同一直线上的最大点数的主要内容,如果未能解决你的问题,请参考以下文章
找到一个具有最大点数的圆 ((x,y,r));给定二维平面中的一组点(x,y)
Luogu 1429 平面最近点对 | 平面分治
踢罐子 [几何+乱搞]
leetcode--03.位于同一条直线上点最大个数
LeetCode:Database 31.平面上的最近距离
应用运筹学基础:组合优化 - 近似算法选讲