LQ0154 平面切分计算几何
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0154 平面切分计算几何相关的知识,希望对你有一定的参考价值。
题目来源:蓝桥杯2020初赛 C++ B组J题
题目描述
平面上有N 条直线,其中第i 条直线是y = Ai * x + Bi。
请计算这些直线将平面分成了几个部分。
输入格式
第一行包含一个整数N。
以下N 行,每行包含两个整数Ai, Bi。
对于50% 的评测用例,1 ≤ N ≤ 4, -10 ≤ Ai, Bi ≤ 10。
对于所有评测用例,1 ≤ N ≤ 1000, -100000 ≤ Ai, Bi ≤ 100000。
输出格式
一个整数代表答案。
输入样例
3
1 1
2 2
3 3
输出样例
6
问题分析
(略)
AC的C++语言程序:
/* LQ0154 平面切分 */
#include<iostream>
#include<set>
using namespace std;
const int N = 1000;
pair<double, double> ab[N];
bool vis[N] = false;
long long ans;
int main()
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> ab[i].first >> ab[i].second;
set<pair<double, double> > p;
for (int j = 0; j < i; j++)
if (vis[j]) continue; // 直线重复
if (ab[i].first == ab[j].first) // 标记ai和bi
if (ab[i].second == ab[j].second)
vis[i] = true;
break;
else
continue;
pair<double, double> t;
t.first = (ab[j].second - ab[i].second) / (ab[i].first - ab[j].first); // 交点x坐标
t.second = ab[i].first * t.first + ab[i].second; // 交点y坐标
p.insert(t);
if (!vis[i]) ans += p.size() + 1; // 若不重复更新
cout << ans + 1 << endl;
return 0;
以上是关于LQ0154 平面切分计算几何的主要内容,如果未能解决你的问题,请参考以下文章