计算直线的交点数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7262 Accepted Submission(s): 3227
Problem Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量.
Output
每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
Sample Input
2 3
Sample Output
0 1 0 2 3解题分析:n=1 时无交点;n=2 时有0个交点,或者有1个交点;n=3 时无交点,或者有2个交点,或者有3个交点;n=4 时有任意一条直线与其余1条直线平行则有 (4-2)*2+2条直线交点数,或者 任意一条直线与其余2条直线平行则有 (4-3)*1+1条直线交点数,或者任意一条直线与其余任意一条直线都不平行则有 4*(4-1)/2个交点;……………………由此可得动态转移方程式为 (m-r)*r+r条自由直线的交点数 r取值区间(0,m-1)解题代码:#include <stdio.h> #include <stdlib.h> int a[21][191];//a[i][j]==1表示i条边会有j个交点 int main() { int i,j,k,n; /**最开始将数组清为0**/ for(i=0; i<=20; i++) for(j=0; j<=190; j++) a[i][j]=0; /**不管你有几条线,都有可能是0个交点**/ for(i=1; i<=20; i++) a[i][0]=1; /**递推的过程i表示边数,j表示自由的边数,k表示有多少交点数,利用动态转移方程(i-j)*j+j条直线可能的交点数**/ for(i=2; i<=20; i++) for(j=0; j<i; j++) for(k=0; k<=190; k++) if(a[j][k]==1) a[i][(i-j)*j+k]=1; while(scanf("%d",&n)!=EOF) { printf("0");//这里提前输出一个0,是为了控制格式符合要求 for(i=1; i<=n*(n-1)/2; i++) if(a[n][i]!=0) printf(" %d",i); printf("\n"); } return 0; }