HDU-1466 计算直线的交点数

计算直线的交点数

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");
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值