链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466
解题思路:
定义一个数组a[21][200],21表示最多有20条直线,200表示交点的最多个数
直线交点的最多个数很简单,就是n*(n-1)/2,20条直线最多交点数为190
当a[i][j]=1时,表示i条直线存在有j个交点的情况
当目前有n条直线时
1.有n-1条直线平行,1条不平行,有n-1个交点,且1条直线自身无交点
2.有n-2条直线平行,2条不平行,2条直线自身有0或1个交点,交点数为
(n-2)*2+0
或(n-2)*2+1
即a[n][0]或a[n][1]
3.有n-i条直线平行,i条不平行,i条直线自身的交点情况为a[i][j](j从1到200遍历)
交点数为(n-i)*i+j
,即转化为求解这i条直线自身的交点情况
由上可知,当a[i][j]=1即j条直线存在j个交点时,
n条直线中有i条直线不平行且有(n-i)*i+j
个交点的情况也存在中
故对a[n][(n-i)*i+j]赋值1
因此可设计一个三重循环,第一重为直线,第二重为不平行的直线条数,第三重为交点个数,通过判定条件确定交点是否存在
编程时应设立初值,即直线全部平行,交点为0的情况
#include <stdio.h>
#include <math.h>
int main() {