杭电1466

平面上有N条直线,且无三点共点,

View Code
 1 //杭电1466
 2 /*
 3 2
 4 3
 5 
 6 
 7 0 1
 8 0 2 3
 9 */
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 int main ()
14 {
15     int dp[21][191],i,j,r,n,max;
16     
17     memset(dp,0,sizeof(dp));  //数组dp空间初始化为0
18     
19     for(i=0;i<21;i++)
20         dp[i][0]=1;  //0个交点的情况初始值为1
21     
22     dp[1][0]=1;  //递归出口
23     
24     for(i=2;i<21;i++)
25     {
26         for(r=1;r<i;r++)
27         {
28             for(j=0;j<191;j++)  //20条直线最多交点数为190 
29             {
30                 if(dp[i-r][j]==1)  //递归思想:如果 r 条直线存在交点数 j (这里 i - r 保证了r 可以取到 1 至 i - 1,即有dp[r][k])
31                     dp[i][j+(i-r)*r]=1;  //则i条直线必有(i-r)*r+j(j 即dp[r][k])个交点,标记为 1
32             }
33         }
34     }
35 
36     while(scanf("%d",&n)!=EOF)
37     {
38         printf("%d",0);
39         max=n*(n-1)/2;
40         for(j=1;j<=max;j++)
41         {
42             if(dp[n][j])
43                 printf(" %d",j);
44         }
45         printf ("\n");
46     }
47     
48     return 0;
49 } 

计算直线的交点数

posted @ 2012-07-05 11:02  zlyblog  阅读(240)  评论(0编辑  收藏  举报