HDU 1466 计算直线的交点数 http://acm.hdu.edu.cn/showproblem.php?pid=1466
由题意不难得出 n=1 时 输出 0
n=2 时 输出 0 1
n=3 时 输出 0 2 3
现在我们分析当N=4时的交点数
① 当第N条直线平行于前3条直线时 此时交点数为0
② 当第N条直线平行于前2条直线时 此时三条平行直线与另外一条直线必有3*1个交点
而此时另外1条直线有0个交点 因此交点数为 1*3 + 0 = 3
③ 当第N条直线平行于前1条直线时 此时两条平行直线与另外两条直线必有2*2个交点
而此时另外2条直线有0个或1 个交点 因此交点数为 2*2 + 0 = 4 或 2*2 + 1 = 5
④ 当N条直线都不平行时 此时第N条直线与另外三条直线必有1*3个交点
而此时另外3条直线有0个、2个或3个交点 因此交点数为 1*3 + 0 = 3 、1*3 + 2 = 5、1*3 + 3 = 6
所以 当N=4时,可能有0、3、4、5、6个交点
根据上面的分析,我们可以得到规律
第N条直线可以与 0~(N-1)条直线平行 且有且必有 平行线数*(N-平行线数)个交点
另外(N-平行线数)条直线又可根据(N-平行线数)条直线的交点数得到
互相组合,即可得到N条直线的交点个数
----------------------------------------------------------------------------------------------------------------------------------------
由已知直线数,得出最大交点数为 n*(n-1)/2
题中N<=20 因此最大交点数为190
将N条直线的交点数进行打表 存入f[直线数][交点数]中
#include<stdio.h>
#include<string.h>
int main(void)
{
int n,f[21][192],i,j,k;
memset(f[0],0,sizeof(f[0]));
memset(f[1],0,sizeof(f[1]));
f[1][0] = 1;
for (i=2;i<=20;i++){
memset(f[i],0,sizeof(f[i]));
f[i][0] = 1; //存在N条直线全部平行
for (j=1;j<i;j++){ //j为与第N条直线不平行的直线数
for (k=0;k<192;k++){
if (f[j][k]==1) f[i][(i-j)*j+k] = 1; //k为不与第N条直线平行的直线的交点数
}
}
}
while(scanf("%d",&n)!=EOF){
printf("0");
for (i=1;i<192;i++)
if (f[n][i]==1) printf(" %d",i);
printf("\n");
}
return 0;
}