hdu1249(三角形划分区域,直线划分区域,折线划分区域)

来源:互联网 发布:coc黑水罐升级数据 编辑:程序博客网 时间:2024/04/28 10:02

题目链接:三角形

题目大意:中文题目

分析:

递推

1、一条线段和一条射线都可以将平面分成两个部分

2、折线的端点处只能将平面分成一个部分


一、首先考虑直线的情况


      如上图,一条直线将一个平面分成两个,两个平面分成4个,当加入第三条直线时,与前两条直线产生了两个交点,将第三条直线分成了1条线段和两条射线,将原有的区域一分为二,增加了3个区域。

     递推规律如下:

     假设对前n-1条直线有f(n-1)个区域

       当增加1条直线的时候,增加了n-1个交点,这n-1个交点产生了n-2条线段和2条射线。

      增加了n-2+2=n个区域

      于是f(n)=n+f(n-1)

      得发f(n)=(n+2)*(n-1)/2+2


二、考虑折线的情况


如图,当只有一条直线的时候,将平面划分为两个区域

如右图,加上第n条折线时,第n条折线的每条射线分别和前n-1条折线相交,即和前2(n-1)条射线相交,增加了2(n-1)个交点,即增加了2(n-1)条线段和一条射线

注意现在暂时不算蓝色折线交点,因为折线的交点值增加一个区域,即增加了2(n-1)-1条线段和1条射线,共增加了2(2(n-1))个区域

最后在加上第n条折线自带的交点,即途中蓝色节点所增加的区域:1

即增加了2(2(n-1))+1个区域

递推方程为f(n)=4n-3+f(n-1),f(1)=2


三、考虑线段的情况


如图,当只有一个三角形时,划分为2个区域

当加上第n个三角形时,每条边最多与前n-1个三角形,即3*(n-1)个线段相交,如图,运用第2个部分的结论,但是此时是增加了2(n-1)-1条线段和2条蓝色顶点带来的线段,共增加了3(2(n-1)-1)个区域,再加上3个蓝色定点,共增加了6(n-1)个区域

所以递推方程为f(n)=6*(n-1)+f(n-1),f(1)=2



代码

#include <stdio.h>int main(){    //freopen("in.txt","r",stdin);    int T,n;    scanf("%d",&T);    while(T--){        scanf("%d",&n);        printf("%d\n",3*n*(n-1)+2);    }    return 0;}


0 0
原创粉丝点击