C++求解:平面上有n个点,问总共可以组成多少条直线

思路

对输入的点,两两组合求取斜率,这样可能会出现某一斜率对应多对点。然后对属于同一斜率的多对点,当成一幅图,求取连通分支个数

这里对对属于同一斜率的多对点,当成一幅图,求取连通分支个数解释一下:
假设对于斜率k=1.0,有点对
(1,1) ,(2,2)
(2,2),(3,3)
(3,3,),(1,1)
(4,3),(3,2)
那么实际上只有两条直线,(1,1),(2,2),(3,3)是连在一起的,(4,3),(3,2)是连在一起的。其实就是对应两个连通的分支。
求取连通分支,可以利用并查集。

代码思路解析:
首先定义两个结构体
point和slope,point对应平面上的坐标值,其中ID是给一个点标号,这里是为了在并查集中求取连通分支用。
slope是对应于某一斜率,它所包含的点对。其中每一对的一个点存在vector<point> dot1,另一个点存在vector<point> dot2。value就是对应的斜率值。
对于输入:
vector<point> points;来保存输入的点。
vector<slope>slopes;来保存总共可以有多少个斜率。
对于每一个斜率,求取连通分支个数:

for (int i = 0; i < len; i++)
        count = count + CalConnectArea(slopes[i].dot1, slopes[i].dot2);//计算每个斜率对应的连通分支个数

返回count就是最终的直线数。

写到这,有一股好熟悉的节奏。。。。。。

代码

#include<iostream>
#include<fstream>
#include<vector>
#define sigma 0.0001
#define slope_max 10000//斜率无穷大定义为10000
using namespace std;
struct point
{
    double x;
    double y;
    int ID;//给每个点标号
    point(int x1, int y1,int ID=0) :x(x1), y(y1),ID(ID) {};
    bool operator==(const point b) const
    {
        return (abs(this->x - b.x)<sigma) && (a
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值