计算直线的交点数(HDU 1466)

 

计算直线的交点数(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

 

 

分析:

1,

将n条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1和直线2最多有两个交点......直线n和其他n-1条直线最多有n-1个交点,由此得出n条直线互不平行且无三线共点的最多交点数:

max=1+2+...+(n-1)=n(n-1)/2;

2,

假设一共有n=a+b条直线
(即n条直线分成2组,分别为a条和b条)
则总的交点数= a内的交点数
        +b内的交点数
        +a,b之间的交点数  

3,

m条直线的交点方案数
=(m-r)条平行线与r条直线交叉的交点数
  + r条直线本身的交点方案
=(m-r)*r+r条之间本身的交点方案数(0<=r<m)

m-r条平行线无交点

 

c实现源码:

 

#include <stdio.h>


int main()
{
 int m,n,k,dot[21][200],i,j;
 for(i=0;i<200;i++)
 {
  dot[0][i]=0;
 }
 for(i=1;i<21;i++)
 {
  dot[i][0]=1;
  for(j=1;j<=i*(i-1)/2;j++)
  {
   dot[i][j]=0;
  }
  for(j=1;j<i;j++)
  {
   m=i-j;//j条直线平行,i-j条直线不平行于j条直线
   for(k=0;k<=m*(m-1)/2;k++)
   {
    if(dot[m][k])//寻找i-j条直线内部交点种类
    {
     dot[i][k+j*m]=1;//k+j*m为总的交点种类
    }
   }
  }
 }
 for(;scanf("%d",&n)==1;)
 {
  printf("0");
  for(i=1;i<=n*(n-1)/2;i++)
  {
   if(dot[n][i])
   {
    printf(" %d",i);
   }
  }
  printf("\n");
 }
 return 0;
}

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值