zoukankan      html  css  js  c++  java
  • 直线交点数种类 P2789 直线交点数

    题目

    平面上有N条直线,且无三线共点,那么这些直线能有多少不同的交点数?

    https://www.luogu.com.cn/problem/P2789

    题目分析

    我们将n条直线编号,分别称为直线1、直线2、…、直线n。直线2 与直线1 最多有一个交点,直线3与直线1和直线2最多有2个交点,……,直线n与其它 (n-1) 条直线最多 (n-1) 个交点。

    由此看出,n条无三线共点的直线最多的交点数 max=1+2+…+(n-1)=n(n-1)/2。

    但本题我们要求解的是:这 n 条直线共有多少种不同的交点数? 仍然从举例出发。下面列举了 n=1、2、3、4 四种情况各自的交点情况:

    具体分析一下 n=4 的情况:

    1)4 条直线全部平行,则 0 交点 { =4*(4-4)}。

    2)其中 3 条直线平行,则 3 交点 { =3*(4-3) }。

    3)其中 2 条直线平行,则这2条直线与另2条直线的交点数为4,而另2条直线之间可能有0个或1个交点(见 n=2 的情况,共 4 个交点或 5 个交点。{=2*(4-2)+0 或 1 }

    4)4 条直线均不平行(可看成 1 条直线平行),这 1 条直线与其它 3 条直线的交点数为 3,而其 它 3 条直线之间的交点数为 3,共 6 个交点。{ =1*(4-1)+3 }

    经过以上分析,我们可以得如下结论:

    m 条直线的交点方案=r 条平行线与(m-r)条直线交叉的交点数+(m-r)条直线本身的交点方案

    =r*(m-r)+(m-r)条直线本身的交点方案 (1<=r<=m)

    在具体编程时,我们设置一个标志数组 f[0..max],在使用上述结论递归求解的过程中,每得到一种交点数 k,则置 f[k]为 true(初始 f[0]~f[max]均为 false)。

    参考:https://www.luogu.com.cn/blog/user34320/solution-p2789

    代码

    #include<iostream>
    using namespace std;
    int n, ans = 0; bool f[10010];
    void suv(int p, int m) {
        if (p == 0)
        {
            if (!f[m])
                ans++;
            f[m] = 1;
        }
        else for (int r = p; r >= 1; r--)
            suv(p - r, r*(p - r) + m);//当P==2的时候,r*(p - r) + m为2*2+0=4;递归进入后记录f[4],之后还要继续递归2,因为剩下的2条线还有可能平行或者相交,就是4+0与4+1,会产生新的结果
    }
    int main() {
        cin >> n; 
        suv(n, 0);
        cout << ans;
    }
  • 相关阅读:
    MongoDB + Spark: 完整的大数据解决方案
    07对象字面量
    05JavaScript中数组的使用
    04JavaScript中函数也是对象
    03JavaScript中的函数预解析
    02通过arguments实现方法重载
    01函数重名问题
    mxGraph 学习笔记 --mxGraph常用功能代码
    mxGraph学习笔记--设置节点鼠标事件
    mxGraph 学习笔记 --右键菜单
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12863626.html
Copyright © 2011-2022 走看看