Luogu P2789 直线交点数

题目描述:

平面上有\(N\)条直线,且无三线共点,那么这些直线能有多少不同的交点数?


这道题的关键在于: 我们认为线与线之间只存在平行或相交,而不考虑具体位置,并且无三线共点。

因此我们只需考虑直线的平行与相交关系。

此题的目的是求交点方案数

如何求交点:

可以从简单的来看:

一条直线,必然只有一种方案;

两条直线:两条直线平行,\(0\)个交点,两条直线相交,\(1\)个交点,两种方案

三条直线:

四条直线:

image-20200417185734982

五种方案;

通过上面的举例,发现可以按照有几条直线平行进行讨论;

如果\(m\)条直线有\(r\)条直线平行,那么剩下的\((m-r)\)条直线,每条直线都会与这\(r\)条直线相交

也就会产生\(r*(m-r)\)个交点,然后再考虑这剩下的\((m-r)\)条直线内部的相交平行关系,我们发现这是一个递归问题

因此我们可以递归来做,因为要求的是共有几种不同的交点方案,因此我们可以将每一种不同的方案求出来的交点数标记,最后统计答案;

\(code:\)

#include<bits/stdc++.h>

using namespace std;

int n,ans;
bool p[10010];

int g(int n,int k) {
	if(n==0) 
		p[k]=1;
	else 
		for(int i=n;i>=1;i--) 
			g(n-i,i*(n-i)+k);
}

int main() {
	scanf("%d",&n);
	g(n,0);
    for(int i=0;i<=10009;i++)
        if(p[i]) 
            ans++;
	printf("%d",ans);
	return 0;
}
posted @ 2020-04-18 18:31  Sweetness  阅读(231)  评论(0编辑  收藏  举报