原题链接
2873. 平面切分 - AcWing题库https://www.acwing.com/problem/content/description/2876/代码
#include<iostream>
#include<set> //stl:set容器头文件引用 set不能添加已经存在的元素
using namespace std;
typedef pair<double, double> pdd; //typedef可以将一种数据类型定义为自己习惯的名称。
set<pdd> line; //pair可以将两个数据合并成一个数据保存。这里将直线的斜率和截距作为一个数据保存,表示一条直线。
pdd iter; //存两直线焦点
int res = 1;
void compute(double x, double y)
{
set<pdd> points;//焦点集
for (auto l = line.begin(); l != line.end(); l++) //遍历已经存在的直线,计算它们和(x,y)直线的焦点
{
double a = l->first;
double b = l->second;
if (a != x)//不平行 则肯定相交
{
iter.first = (b - y) / (x - a);//计算焦点x
iter.second = iter.first *x + y;//计算焦点y
points.insert(iter);//存储焦点
}
}
res += points.size();//有几条焦点,就加几
}
int main()
{
int n; cin >> n;
while (n--)
{
double k, b;
cin >> k >> b;
int m = line.size();
line.insert(make_pair(k, b));
if (m != line.size())//如果能够添加该直线,说明该直线未出现过
{
res++;//如果该直线不和任意直线相交,划分的平面只加1, 再与其他直线有k个交点,就再加k(通过compute函数来计算)
compute(k, b);//计算该直线与已经存在的直线的交点个数
}
}
cout << res << endl;
}