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 平面切分计算几何的主要内容,如果未能解决你的问题,请参考以下文章

计算几何学习5

计算几何/平面和空间

POJ2826计算几何线段交点

LightOJ 1062 - Crossed Ladders 基础计算几何

BZOJ 1007 水平可见直线 | 计算几何

UVa 10213 How Many Pieces of Land ? (计算几何+大数)