题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466
计算直线的交点数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8799 Accepted Submission(s):
3973
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
Author
lcy
Source
题目大意:计算直线的交点数,注意考虑平行的问题,最后输出所有可能的交点个数。
解题思路:这里采用dp的方法。代码中有详解。
详见代码。
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; long long a[][]; //a[i][j]表示i条直线有j个交点,因为20条直线最多有C(20,2)=190条直线
//开200数组就够,下面循环也是一样。 int main ()
{
memset(a, , sizeof());
for (int i=; i<=; i++)
{
a[i][] = ;
for (int j=; j<=i; j++) //i条直线中有j条非平行线,则有i-j条非平行线。
{
for (int k=; k<=; k++) //遍历0-190,若j条线有k个交点成立,则在加上i-j条平行线就有i条线(i-j)*j+k个交点成立
{
if (a[j][k])
a[i][(i-j)*j+k] = ;
}
}
}
int n;
while (scanf ("%d",&n)==)
{
printf ("");
for (int i=; i<=; i++)
if (a[n][i])
printf (" %d",i);
printf ("\n");
}
return ;
}