思路
对输入的点,两两组合求取斜率,这样可能会出现某一斜率对应多对点。然后对属于同一斜率的多对点,当成一幅图,求取连通分支个数。
这里对对属于同一斜率的多对点,当成一幅图,求取连通分支个数解释一下:
假设对于斜率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