解题思路:

容易列举出N=1,2,3的情况:
0
0,1
0,2,3
如果已知<N的情况,我们来分析加入第N条直线的情况(这里N=4):
1.第四条与其余直线全部平行 => 无交点;
2.第四条与其中两条平行,交点数为(n-1)*1+0=3;
3.第四条与其中一条平行,这两条平行直线和另外两点直线的交点数为(n-2)*2=4,而另外两条直线既可能平行也可能相交,因此可能交点数为:
(n-2)*2+0=4 或者 (n-2)*2+1=5
4. 第四条直线不与任何一条直线平行,交点数为:
(n-3)*3+0=3 或者 (n-3)*3+2=5 或者 (n-3)*3+3=6
即n=4时,有0个,3个,4个,5个,6个不同交点数。
从上述n=4的分析过程中,我们发现:

m条直线的交点方案数
=(m-r)条平行线与r条直线交叉的交点数 + r条直线本身的交点方案
=(m-r)*r+r条之间本身的交点方案数(1<=r<=m)

我们设置一个二维数组dot[i][j]代表i条直线有j个交点的情况,若存在等于1,否则为0;
可以推出:只要dot[j][k]=1(j条直线有k个交点是成立的),那么肯定有dot[i][(i-j)*j+k]=1;
参考代码:

#include <stdio.h>
int main()
{
	int m,n,k,dot[21][200],i,j;
	for(i=0;i<200;i++)
		dot[0][i]=0;
	for(i=1;i<=20;i++)
	{
		dot[i][0]=1;  //不管多少直线都存在0个交点的情况,即所有直线平行
		for(j=1;j<=i*(i-1)/2;j++)
			dot[i][j]=0;
		for(j=0;j<i;j++)  //(i-j)*j+k表示当有i条直线时,交点存在的值(在0到200这200个数(坐
    		for(k=0;k<=(j-1)*j/2;k++)  //标)中,当有交点值时,将交点值所在坐标的值置为1)
     			if(dot[j][k]==1)
      				dot[i][(i-j)*j+k]=1;		
	}
	while(scanf("%d",&n)!=EOF)
	{
		printf("0");
		for(i=1;i<=n*(n-1)/2;i++)
		{
			if(dot[n][i])
				printf(" %d",i);
		}
		printf("\n");
	}
	return 0;
}


点赞(1)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论