1466 计算直线的交点数
1 # include <iostream>
2 # include <cstdio>
3 using namespace std;
4 int main()
5 {
6 int n, i, j, k;
7 int edge[21][191];
8 for (i=1; i<21; ++i)
9 {
10 for (j=0; j<=190; ++j)
11 {
12 if (j == 0)
13 edge[i][j] = 1;
14 else
15 edge[i][j] = 0;
16 }
17 }
18 for (i=2; i<=20; ++i)
19 {
20 for (j=i-1; j>=1; --j)
21 {
22 for (k=0; k<=190; ++k)
23 {
24 if (edge[i-j][k] == 1)
25 {
26 edge[i][k+(i-j)*j] = 1;
27 }
28 }
29 }
30 }
31 while (scanf("%d", &n)!=EOF)
32 {
33 cout<<"0";
34 for(j=1;j<=n*(n-1)/2;j++)
35 if(edge[n][j])
36 cout<<" "<<j;
37 cout<<endl;
38 }
39 return 0;
40 }
计算直线的交点数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2283 Accepted Submission(s): 989
Problem Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量.
Output
每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
Sample Input
2 3
Sample Output
0 1 0 2 3
解题思路:
对于任意的n(n为正整数)条直线
有以下情况:
1条平行(全不平行)时,(n-1)条线的所有情况+(n-1)*1
2条平行,(n-2)条线的所有情况+(n-2)*2
...
i条平行,(n-i)条线的所有情况+(n-i)*i
...
n-1条平行,1条线的所有情况+ 1*(n-1)
以上所说i条平行,是指保证其余n-i条一定不平行
有以下情况:
1条平行(全不平行)时,(n-1)条线的所有情况+(n-1)*1
2条平行,(n-2)条线的所有情况+(n-2)*2
...
i条平行,(n-i)条线的所有情况+(n-i)*i
...
n-1条平行,1条线的所有情况+ 1*(n-1)
以上所说i条平行,是指保证其余n-i条一定不平行