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\) 的情况:
-
\(4\) 条直线全部平行,则 \(0\) 交点 \({ =4*(4-4)}\)。
-
其中 \(3\) 条直线平行,则 \(3\) 交点 \({ =3*(4-3) }\)。
-
其中 \(2\) 条直线平行,则这\(2\)条直线与另\(2\)条直线的交点数为\(4\),而另\(2\)条直线之间可能有\(0\)个或\(1\)个交点(见 \(n=2\) 的情况,共 \(4\) 个交点或 \(5\) 个交点。\({=2*(4-2)+0 或 1 }\)
-
\(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.cnblogs.com/littlehb/p/15184254.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法