您的位置:首页 > 其它

hdu 1466 计算直线交点数

2017-03-15 17:38 302 查看
链接: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
[0]或a
[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-i)*i+j]赋值1

因此可设计一个三重循环,第一重为直线,第二重为不平行的直线条数,第三重为交点个数,通过判定条件确定交点是否存在

编程时应设立初值,即直线全部平行,交点为0的情况

#include <stdio.h>
#include <math.h>

int main() {
int n,i,j,k,a[21][201]={0};
a[0][0] = 1;
a[1][0] = 1;
for (i=2;i<21;i++) {//共有i条直线
a[i][0] = 1;//一定会出现直线全部平行,交点为0的情况
for (j=1;j<i;j++) //从中取j条不与第n条直线平行的直线
for (k=0;k<=200;k++) //j条直线的交点情况
if(a[j][k])
a[i][(i-j)*j+k]=1;
}
while(scanf("%d",&n)!=EOF){
for (i=0;i<=200;i++) {
if(a
[i]) {
if(i)
printf(" ");
printf("%d",i);
}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm