HDU1466 计算直线交点(输出各种交点方案)

来源:互联网 发布:orcad怎么导出网络表 编辑:程序博客网 时间:2024/05/21 19:49

#include<stdio.h>
#include<stdlib.h>
int a[21][191];
int main()
{
 int i,j,k,sum,p,q,n;
 a[0][0]=1;
 a[1][0]=1;
 a[2][0]=1;
 a[2][1]=1;
 for(i=3;i<=20;i++)
 {
  for(j=0;j<i;j++)
  {
   sum=j*(j-1)/2;  //i条直线中j条自由线的最大交点数
   for(k=0;k<=sum;k++)
   {
    if(a[j][k])   //j条直线k个交点的情况存在
    {
     p=(i-j)*j+k;  /*i条直线中有j条自由线,则i-j条平行线与j条自由线
              有 (i-j)*j个交点 ,*/
     a[i][p]=1;   //i条直线p个交点的情况存在则标记为1
    }
   }
  }
 }
 while(scanf("%d",&n)!=EOF)
 {
  q=n*(n-1)/2;
  for(i=0;i<q;i++)
  {
   if(a[n][i]) printf("%d ",i);
  }
  printf("%d/n",q);
 }
 return 0;
}
/*设一个数组dp[i][j]来记录i条直线,j个交点的情况是否存在,若存在,dp[i][j]=1,反
之,dp[i][j]=0.在输入n之前,先将所有可能情况用数组dp记录下来。方法如下:
dp[i][0]=1;无论有多少条直线,交点为0(所有直线平行)的情况必定存在,故赋值为1.
假设有n条直线,那么这n条直线的交点数可以看作是(n-i)*i与j的和,这里(n-i)表示
平行线的条数,i表示自由线的条数,j表示i条自由线的交点数。因为1条自由线与(n-i)条
平行线必定有(n-i)*1个交点,这里申明下自由线与平行线不会平行,否则自由线与平行线
就没有区分的必要了。那么i条自由线与平行线的交点总数就为(n-i)*i,由于i条自由线可
能互相平行也可能相交,故需要加上i条自由线自身的交点数j。其实这个j与计算n条直线的
交点数的方法是一样的,只不过规模缩小了,正是因为这点我们才可以使用DP算法来解这题。
数学表达式:
f(n)=(n-i)*i+j;*/

原创粉丝点击