计算直线的交点数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10831 Accepted Submission(s): 4985
Problem Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
比如,如果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>
#define N 200 //当n=20的时候交点数目最多为n*(n-1)/2 < 200
//m条直线的交点数=r条平行线与m-r条直线交叉的交点数+ m-r条直线本身的交点数 =
//r*(m-r) + m-r条直线之间的交点数。(1<=r<=m)
int dp[21][N]; //dp[直线的总数][交点的个数] = 状态(本状态存在为1,否则为0)
int main () {
int i, n, j, k;
for (i=0; i<21; i++)
dp[i][0] = 1; //所有的直线都平行
for (i=2; i<21; i++) //枚举n的值,并且打标
for (j=1; j<i; j++) //枚举与i相交的边的数目
for (k=0; k<N; k++)//枚举j条边的交点情况
if (dp[j][k]) //如果存在则推论成功
dp[i][(i-j)*j+k] = 1;
while (scanf ("%d", &n) != EOF) {
for (i=0; i<N; i++) {
if (dp[n][i]) {
if (i)
printf (" ");
printf ("%d", i);
}
}
printf ("\n");
}
}