其实在写这篇文章之前,感觉上与现在的计算机技术并没有什么联系。但是,线段与平面划分空间的问题是代数结构,特别是递推关系中一类十分重要的题目。所以在这里特写一篇文章,对这一类的问题进行分析。
我们知道,平面是二维的,而空间是三维的,这一类划分空间的问题是具有很多共性的。首先,我们来思考两条直线划分平面的问题.
一条直线可以将平面划分为两个部分,两条直线最多可以将平面划分为4个部分,当有n条直线呢?
我们可以发现,空间的划分是有交点个数的多少来决定的。第n条直线最多可以与其余的直线有n-1个焦点,被划分为2条射线和n-2条线段,与此同时,会多出n个空间。
于是,我们得到了一个递推公式f(n)=f(n-1)+n.
下面一个问题:http://acm.hdu.edu.cn/showproblem.php?pid=2050
题意就是:有n个v型(共起点射线),最多可以将平面分割成为多少个空间。
我们容易知道,1个v型可以将平面分割成为2个空间,而在第n个v字加入时,平面上已有2(n-1)条射线。这样我们最多可以与其余的v字有4(n-1)个交点,但是,v字不是相交直线而是两条共起点的射线,所以在具体划分时会少一个空间,得到递推公式f(n)=f(n-1)+4n-3.
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int c,n;
long long num[10005] = {0,2};
int main()
{
int i;
for (i = 2; i <= 10000; i++)
num[i] = num[i - 1] + 4 * i - 3;
cin >> c;
while (c--)
{
cin >> n;
cout << num[n] << endl;
}
return 0;
}
下面是最后一个问题:http://acm.hdu.edu.cn/showproblem.php?pid=1290
问题的大意就是,n个平面最多可以将空间分为多少个部分。
我们容易知道,1个平面最多可以将空间分为2个部分,对于第n个平面来说,其最多可以和其余的平面有n-1条交线,而这n-1个平面,要达到分割的最大化,必须互不平行,所以我们得到n-1条互相会相交的直线,他们的相交即标志着新空间的诞生。所以我们知道g(n)=g(n-1)+f(n-1)得到这一层递推关系之后,我们的得到以下的代码:
#include<iostream>
#include<cstdio>
using namespace std;
long long num[1005] = {0,2};
int n;
int main()
{
int i;
for (i = 2; i <= 1000; i++)
num[i] = num[i - 1] + (i*(i - 1)) / 2 + 1;
while (scanf_s("%d", &n) != EOF&&n)
cout << num[n] << endl;
return 0;
}
以上的问题都遵从一个特点,即初始条件十分容易得到,而对于大数据往往很难得到,所以我们要做的就是得到从n-1到n的转移方程,问题便迎刃而解。