直线,曲线,折线分割平面以及平面分割空间问题

来源:互联网 发布:ubuntu停止当前命令 编辑:程序博客网 时间:2024/05/24 06:40




(一)直线分割平面问题

直线要想最多分割平面的前提:任意两条直线都要相交,任意三条直线不能交于同一点。

设n条直线最多分割平面为f(n)部分,一条直线分平面为两部分,f(1)=2;f(2)=4;f(3)=7;......,首先要弄明白的就是f(n)与f(n+1)的关系。

看新增加的第n+1条直线,由前提条件可知,增加的第n+1条直线,与前n条有 n个交点,而这n条直线又把第n+1条直线分成n+1段,而这n+1段又把它所在的平面一分为二,所以由n条直线增加到n+1条直线增加了n+1个区域。

即:f(n+1)=f(n)+n+1;故有:

f(1)=2;

f(2)=f(1)+2;

f(3)=f(2)+3;

......

f(n)=f(n-1)+n;

以上各式相加得:f(n)=2+2+3+4+...+n=(1/2)(n*n+n)+1;f(1)=2同样适合。

f(n)=(1/2)(n*n+n)+1;该结论对以上所有情况都成立。



(二)平面最大分割空间

满足条件的前提是所有平面都相交,任意三个平面不相交于同一直线。

讨论方法同上。

设n个平面最多分割空间为F(n)个区域,一条直线分平面为两部分,即F(1)=2;F(2)=4;F(3)=8;......,接下来要弄清楚F(n)与F(n+1)的关系。

考察n+1个平面,前面的n个平面与这个平面相交得n条交线,已知这n条直线两两相交且没有任意三条直线相交于同一点,由前面讨论的结果知:n条直线把n+1个平面分成f(n)部分,而f(n)部分把他们所在的空间一分为二,这样有:F(n+1)=F(n)+f(n);故有:

F(1)=2;

F(2)=F(1)+f(1)=F(1)+(1/2)*(1*1+1)+1;

F(3)=F(2)+f(2)=F(2)+(1/2)*(2*2+2)+1;

F(4)=F(3)+f(3)=F(3)+(1/2)*(3*3+3)+1;

......

F(n)=F(n)+f(n)=F(n)+(1/2)(n*n+n)+1;

以上各式相加的:

F(n)=(n*n*n+5*n+6)/6;

这样,n个不同平面最多分割空间为(n*n*n+5*n+6)/6;


题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1290

代码:

#include<stdio.h>
int main()
{
    long long n;
    while(scanf("%lld",&n) != EOF)
    {
        n = (n * n * n + 5 * n + 6) / 6;
        printf("%lld\n",n);
    }
    return 0;
}


(三)封闭曲线分平面问题

题目大致如设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。

析:当n-1个圆时,区域数为f(n-1).那么第n个圆就必须与前n-1个圆相交,则第n个圆被分为2(n-1)段线段,增加了2(n-1)个区域。
故:
f(n)=f(n-1)+2(n-1)     
         =f(1)+2+4+……+2(n-1)
         =n*n-n+2

f(n)=n*n-n+2;


(四)折线分平面(折线就是一个角,用角分割平面,当然这个角不是平角

根据直线分平面可知,由交点决定了射线和线段的条数,进而决定了新增的区域数。当n-1条折线时,区域数为f(n-1)。为了使增加的区域最多,则折线的两边的线段要和n-1条折线的边,即2*(n-1)条线段相交。那么新增的线段数为4*(n-1),射线数为2。但要注意的是,折线本身相邻的两线段只能增加一个区域。
 故:f(n)=f(n-1)+4(n-1)+2-1
              =f(n-1)+4(n-1)+1
              =f(n-2)+4(n-2)+4(n-1)+2
              ……
              =f(1)+4+4*2+……+4(n-1)+(n-1)   
              =2*n*n-n+1

f(n)=2*n*n-n+1;

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2050

代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<string>

using namespace std;

int main()
{
    int n,m;
    cin>>n;
    while(n--)
    {
        cin>>m;
        cout<<2*(m*m)-m+1<<endl;
    }
    return 0;
}


0 0
原创粉丝点击