HDU 1466 计算直线的交点数

Problem Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
 
Input
输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量.
 
Output
每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
 
Sample Input
2 3
 
Sample Output
0 1
0 2 3
 //有点数学题目的感觉、或者是递推、
//思路:
m条直线的交点方案数
=(m-r)条平行线与r条直线交叉的交点数
   + r条直线本身的交点方案
=(m-r)*r+r条之间本身的交点方案数(1<=r<=m

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[21][1003];
bool cmp(int a,int b)
{
    return a<b;
}
int main()
{
    a[1][0]=0;a[1][1000]=0;
    a[2][0]=0;a[2][1]=1;a[2][1000]=1;
    int i,j,k,tp,l,sum;
    for(i=3;i<=20;i++)
    {  a[i][0]=0;a[i][1000]=0;
       for(l=1;l<i;l++)
       {   tp=i-l;
           for(j=0;j<=a[tp][1000];j++)
             {
                 sum=l*tp+a[tp][j];
                 for(k=0;k<=a[i][1000];k++)
                   if(a[i][k]==sum)
                      break;
                a[i][k]=sum;
                if(k>a[i][1000])
                a[i][1000]=k;
             }
       }
    }
 while(scanf("%d",&k)!=EOF)
 {
      sort(a[k],a[k]+a[k][1000]+1,cmp);
      for(i=0;i<a[k][1000];i++)
        printf("%d ",a[k][i]);
       printf("%d\n",a[k][i]);
 }

    return 0;
}

原文地址:https://www.cnblogs.com/372465774y/p/2440285.html