计算直线的交点数
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 2 Accepted Submission(s) : 1
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
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#include<stdio.h> #include<string.h> int main() { int n,i,j,k; bool dp[30][300];//数组记得一定要开大,后边的开20是不行的,应为是存的最多交点情况至少为20×19/2 int a,b; memset(dp,0,sizeof(dp)); dp[0][0]=1;dp[1][0]=1; for(i=2;i<=22;i++) { dp[i][0]=1; for( j=1;j<i;j++) { a=j;b=i-j; //printf("a=%d b=%d\n",a,b); for( k=0;k<=(b*(b-1)/2);k++) { //printf("dp[%d][%d]\n",b,k); if(dp[b][k]){ dp[i][a*b+k]=1;} } } } while(scanf("%d",&n)!=EOF) { printf("0"); for(int i=1;i<=n*(n-1)/2;i++) if(dp[n][i])printf(" %d",i); printf("\n"); } return 0; }