zoukankan      html  css  js  c++  java
  • 计算直线的交点数

    Description

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

    Input

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

    Output

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

    Sample Input

    2
    3

    Sample Output

    0 1
    

    0 2 3

    n条直线两两相交最多有n*(n-1)/2个交点 n最大为20 交点最多为190 假设f(n)为n条直线的交点方案  有k条不互相平行的直线 那么f(n)=k*(n-k)(n-k条互相平行的直线与k条不互相平行的直线的交点)+f(k)(k条不互相平行直线的交点) 假设dp[i][j](dp[i][f(i)])为i条直线有j个交点   如果存在 dp[i][j]=1否则=0 如果dp[k][m]=1-->f(k)=m(k条直线有m个交点)  dp[i][k*(i-k)+m]=1必定成立(k*(i-k)+f(k)=f(i))  由直线数少的k推出直线数多的i 输出时 输出dp[n][j]==1  的j即可

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    using namespace std;
    #define INF 1<<30;
    int dp[1001][1001];
    int main()
    {
    	memset(dp,0,sizeof(dp));
    	int n,i,j,k,r;
    	    for(i=0;i<=20;i++)//i表示直线数 
    	    {
    	    	dp[i][0]=1;
    	    	for(k=0;k<=i;k++)//k表示不互相平行的直线数 0-->i 
    	    	{
    	    		for(j=0;j<=190;j++)//j表示交点 
    	    		{
    	    			if(dp[k][j]==1)//由小推大 
    	    			{
    	    				dp[i][(i-k)*k+j]=1;
    					}
    				}
    			}
    	    	
    		}
    		while(scanf("%d",&n)!=EOF)
    		{
    			int cut=0;
    				for(j=0;j<=n*(n-1)/2;j++)
    				{
    					if(dp[n][j]==1)
    					{
    							if(cut>0)
    					       printf(" ");
    					       printf("%d",j);
    						     cut++;
    					}
    				}
    			printf("
    ");
    		}
     return 0;
    }
    


    编程五分钟,调试两小时...
  • 相关阅读:
    SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问
    谷歌浏览器扩展程序manifest.json参数详解
    获取天气api
    UVA 10385 Duathlon
    UVA 10668 Expanding Rods
    UVALIVE 3891 The Teacher's Side of Math
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 11210 Chinese Mahjong
    UVA 11384 Help is needed for Dexter
  • 原文地址:https://www.cnblogs.com/kingjordan/p/12027073.html
Copyright © 2011-2022 走看看