问题 F: 平面分割问题
时间限制: 1 Sec 内存限制: 128 MB提交: 9 解决: 9
[ 提交][ 状态][ 讨论版]
题目描述
设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
输入
输出
样例输入
1
3
10
30
500
样例输出
2
8
92
872
249502
提示
多组测试数据
题目智能推荐 |
如下:平面分割问题 - 优快云博客
http://blog.youkuaiyun.com/sinat_34943123/article/details/51440883
问题的提出:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
解:设an为n条封闭曲线把平面分割成的区域个数。 由图3-13可以看出:a2-a1=2;a3-a2=4;a4-a3=6。
从这些式子中可以看出an-an-1=2(n-1)。当然,上面的式子只是我们通过观察4幅图后得出的结论,它的正确性尚不能保证。下面不妨让我们来试着证明一下。当平面上已有n-1条曲线将平面分割成an-1个区域后,第n-1条曲线每与曲线相交一次,就会增加一个区域,因为平面上已有了n-1条封闭曲线,且第n条曲线与已有的每一条闭曲线恰好相交于两点,且不会与任两条曲线交于同一点,故平面上一共增加2(n-1)个区域,加上已有的an-1个区域,一共有an-1+2(n-1)个区域。所以本题的递推关系是an=an-1+2(n-1),边界条件是a1=1。
平面分割问题是竞赛中经常触及到的一类问题,由于其灵活多变,常常感到棘手,下面的例8是另一种平面分割问题,有兴趣的读者不妨自己先试着求一下其中的递推关系。
#include<stdio.h>
int main()
{
int n;
long long a[1100];
a[1]=2;a[2]=4;
for(int i=3;i<=1100;i++)
a[i]=a[i-1]+2*(i-1);
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",a[n]);
}
return 0;
}