1. 程式人生 > >hdu1249(三角形劃分區域,直線劃分區域,折線劃分區域)

hdu1249(三角形劃分區域,直線劃分區域,折線劃分區域)

題目連結:三角形

題目大意:中文題目

分析:

遞推

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;
}