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 0条
n=2 0,1条
n=3 0,2,3条
n=4 0,3,4,5,6条
n条线最多的交点数为n*(n-1)/2;
假设n条线里有i条线平行,那么n条线的交点数为i*(n-i)+j,j表示剩余的(n-i)条线可能的交点数。dp[i][j]=1表示i条线可有j个交点。
1 #include<stdio.h> 2 #include<string.h> 3 #define N 21 4 #define M N*(N-1)/2 5 int dp[N][M]; 6 int main() 7 { 8 int i, j, n, k; 9 dp[0][0] = 1;dp[1][0] = 1; 10 for(n = 2; n <= N; n++){ 11 for(i = 0; i < n; i++){ 12 for(j = 0; j <= i * (i-1) / 2; j++){ 13 if(dp[i][j] == 1){ 14 dp[n][i * (n-i) + j] = 1; 15 } 16 } 17 } 18 } 19 while(~scanf("%d", &n)) 20 { 21 printf("0"); 22 for(i=1; i<=n*(n-1)/2; i++){ 23 if(dp[n][i] == 1){ 24 printf(" %d", i); 25 } 26 } 27 printf(" "); 28 } 29 return 0; 30 }