• 杭电 1466 计算直线的交点数


    Description

    平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。 
    比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。

    Input

    输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量. 

    Output

    每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。

    Sample Input

    2
    3

    Sample Output

    0 1
    0 2 3

    1条线:0
    2条线:0 1
    3条线:0 2 3
    4条线:0 3 4 5 6 
    ……
    可以把直线分成两组,第一组是相互平行的直线,第二组是自由直线,自由直线不与平行直线平行;
    设直线总是为N,设第一组有i条直线,则第二组N-i有条直线。
    以4条线来分析:
    1、当i=4,N-i=0时,交点数:0
    2、当i=3,N-i=1时,交点数:3条平行线与1条自由线的交点个数+1条自由线能形成的交点个数,即3+0=3
    3、当i=2,N-i=2时,交点数:2*2+{0,1}={4,5}
    4、当i=1,N-i=3时,交点数:1*3+{0,2,3}={3,5,6}
     每个自由直线与每个平行直线都有一个交点,j自由直线与i平行直线的交点数为j*i,所以n条直线的交点数等于自由直线与平行直线的交点加上自由直线内部形成的交点 
     
     1 #include<cstdio>
     2 #include<string.h>
     3 int main()
     4 {
     5     int n,i,,k,free;
     6     int d[25][200];                            //d[i][j]表示i条直线有j个交点 
     7     memset(d,0,sizeof(d));
     8     for(i = 1 ; i < 21 ; i++)
     9     {
    10         d[i][0]=1;                            //交点为0总是存在的 
    11         for(free = 0 ; free <= i ; free++)    //free代表自由直线的数量 
    12         {
    13             for(k = 0 ; k < free*(free+1)/2 ; k++)
    14             {
    15                 if(d[free][k] == 1)        
    16                 {
    17                     d[i][free*(i-free)+k]=1;//free*(i-free)+k表示i条直线free条自由直线的交点数(k为自由直线的交点数) 
    18                 }
    19             }
    20         }
    21     }
    22     while(scanf("%d",&n)!=EOF)
    23     {
    24         for(i = 0 ; i <= n*(n-1)/2 ; i++)
    25         {
    26             if(i == 0)
    27                 printf("0");
    28             else
    29             {
    30                 if(d[n][i])
    31                 {
    32                     printf(" %d",i);
    33                 }
    34             }
    35         }
    36         printf("
    ");
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    React中 checkbox 与 label 标签的搭配
    HTML5 FileReader对象
    HTML5 FormData 模拟表单控件 支持异步上传二进制文件 移动端
    Nginx 反向代理
    HTML5触摸事件
    利用React遍历数组,并且用数组的元素生成<li>arrItem</li>标签组
    ECMAScript5 [].reduce()
    E:Unable to locate package
    mv和cp命令
    Error response from daemon: Conflict. The container name "xinying_face" is already in use by container
  • 原文地址:https://www.cnblogs.com/yexiaozi/p/5754082.html
Copyright © 2020-2023  润新知