1.直线(Line)分割平面
由于第n条直线与前n-1条直线相交于n-1个点,这n-1个点将第n条直线划分为n个部分,而这第n条直线的两边分别有L(n-1)和n个部分。故L(n)=L(n-1)+n; L(0) = 1
2.一次折线(Zig)分割平面
由于一条一次折线相对于两条直线相交少了两个部分,所以Z(n) = L(2n) - 2n ; Z(0) = 1
公式:2*n^2-n+1;
3.Z型折线(Zig-zag)分割平面
Z型线与三条之间很相似,但是有两条平行,这样就少了1个部分,如果再将有两条直线平行的三条直线变为Z型的话,则又将少4个部分,这样每个Z型折线比三条直线分平面形成的部分少5个。故ZZ(n) = L(3n)-5n
公式:(9*n^2+3*n+2)/2-5*n;
P.S.对于2,3而言由于后面的图形与前面的图形相交时要获得尽量多的区间,所以交点不会在顶点处,既然不在顶点处,那么本来这个图形相比直线而言少了几个区间,与其他图形相交后仍然少那几个区间
4.圆(Circle)相交
第n个圆与前n-1个圆相交于2(n-1)个点,这2(n-1)个点将第n个圆划分为2(n-1)个圆弧,这每条弧都将原来的一个旧区域一分为二。故C(n) = C(n-1) + 2(n-1) C(0) = 1
1.只考虑圆内部分割的区域: n^2-n+1;
2.也考虑圆外部的区域: n^2-n+2; 当n为0的时候,单独考虑为 1;
5.平面(Flat)分割空间
第n个平面与前n-1个平面有n-1条交线,这n-1条交线分割第n个平面为L(n-1)个区域,则在这个平面的两侧分别把空间分为F(n-1)和L(n-1)个区域,故F(n) = F(n-1) + L(n-1)
公式:(n^3+5*n+6)/6;
6.对没有三条对角线交于一点的凸多边形,计算各边和对角线组成的互不重叠的区域个数
我们从各区域的顶点总数和所有区域的内角和的总和两个角度进行分析:
设:Nk为区域中k边形的个数。
角度1:各区域顶点总数(包括重复计算的数目)的等式为
3N3 + 4N4 + ... + mNm = 4C(n,4) + n(n-2) (等式1)
其中m是各区域边数的最大值,n是凸多边形的顶点数。
左式表示的各区域顶点总数来自两个方面:
由于每两条对角线(或四个顶点)决定一个内部区域的顶点,因此区域的顶点数是4C(n,4),即每个内部顶点在左式中计数4次(总是四个区域公共一个顶点).又因为在计算中,凸多边形的每个顶点(为n-2个三角型的公共顶点)重复计数n-2次,因此左式的计算中,n个顶点被计数为n(n-2).
角度2:所有区域的内角和的总和的等式为
180N1 + 360N2 + 540N3 + ... + (m-2)180Nm = C(n,4)360 + (n-2)180 (等式2)
左式表示的所有区域的内角和的总和来自两个方面:
(1)各内部顶点处区域内角和(360)的总和为C(n,4)360
(2)凸多边形的内角和为(n-2)180
等式2两边同时除以180,得出
N3 + 2N4 + ... + (m-2)Nm = 2C(n,4) + (n-2) (等式3)
殊途同归,由等式1两边同时减去等式3两边,可得出区域总数:
N3 + N4 + N4 + ... Nm = C(n,4) + C(n-1,2)
这就是说,所求的区域总数为C(n,4) + C(n-1,2)
7.n条直线划分矩形
每条直线和矩形必然交于两点,这两点任一个都必然同时属于两个多边形.矩形内部n条直线两两相交且没有3条交于同一点,所以产生n(n-1)/2个交点,每个交点属于4个多边形,所以矩形边上和内部的点数一共为 n(n-1)/2+2n=n(n+3)/2.(不包含矩形的四个顶点)如果尽量让直线与矩形相交的时候交点不是矩形的顶点的话还会多出来4个顶点,每个顶点只属于一个多边形,所以总的点数为n(n+3)/2+4 = (n^2+3n+8)/2.(包含矩形的四个顶点)
内部每个交点处内角和为360度,边上每个交点内角和为180度,顶点处内角和为90度,4个加起来是360度,仿照5的方法列方程可得到区域总数为(n^2+n+2)/2
8.圆圈上n个点两两连线最多把圆分成多少个区域
先把每个点和与它相邻的两个点相连,这样就转化成凸多边形的问题了,求出凸多边形内部的区域数,再加上n就行了.
V – E +F =1; F 是面数,
公式: v=n+n/4 *(i *(n-2-i) ) E=n+n/2 *( i*(n-2-i)+1 ) 注释(i=0,1,2,3,,,n-2).
#include<stdio.h> int shu(int n) { int i,v=0; for(i=0;i<=n-2;i++) v=v+(i*(n-2-i)); return v*n/4+n; } int as(int n) { int i,e=0; for(i=0;i<=n-2;i++) e=e+(i*(n-2-i)+1); return e*n/2+n; } int main() { int x,a,b; scanf("%d",&x); while(x--) { scanf("%d",&a); printf("%d\n",as(a)-shu(a)+1); } return 0; }
9.托兰定理:平面上N个点,至少连【N^2/4】+1条线段必定存在三角形
另一种感到很牛的解法:把这n个点分成两堆,两堆之间互相连线,就是 (n/2 ) * (n/2); 因为分成两堆不会形成三角形,
分成三堆或更多会形成三角形,