生長樹模型

2021-07-04 01:43:33 字數 3573 閱讀 6620

有這麼一顆樹,按照一定的規則進行成長:

1)f : 表示在原來的方向的基礎上水平生長,即在原來的方向的基礎上畫一橫 2)

+ : 增加45度 3)

-  : 減小45度 4)

[ :  記錄該節點末的當前狀態,下次變化從該節點末開始(相當於壓入堆疊push操作) 5)

] :  從上次記錄的節點末恢復操作(相當於出棧操作pop)

一棵樹的原始形狀如下:

f[+f]f[-f]f

第一次生長以後變為:

f[+f]f[-f]f[+f[+f]f[-f]f]f[+f]f[-f]f[-f[+f]f[-f]f]f[+f]f[-f]f

第二次生長以後變為:

f[+f]f[-f]f[+f[+f]f[-f]f]f[+f]f[-f]f[-f[+f]f[-f]f]f[+f]f[-f]f[+f[+f]f[-f]f[+f[+f]f[-f]f]f[+f]f[-f]f[-f[+f]f[-f]f]f[+f]f[-f]f]f[+f]f[-f]f[+f[+f]f[-f]f]f[+f]f[-f]f[-f[+f]f[-f]f]f[+f]f[-f]f[-f[+f]f[-f]f[+f[+f]f[-f]f]f[+f]f[-f]f[-f[+f]f[-f]f]f[+f]f[-f]f]f[+f]f[-f]f[+f[+f]f[-f]f]f[+f]f[-f]f[-f[+f]f[-f]f]f[+f]f[-f]f

下圖是根據上面給定的字串生成的圖形:

要求輸入如下:

n                         //生長樹繁殖的次數, n的範圍:  1 <= n <=10

f[+f]f[-f]f   //生長樹原始的樣子,就其實暗含生成規則,要求原始的樣子不能超過100個字元

要求輸出:

生長樹在原始字串的基礎上,經過n次生長後的樣子,列印其字串

這題看起來好複雜,其實稍加分析一下,問題就明朗化了,下面請看分析:

首先根據給定的字串順序和成長規則,畫出原始圖,這裡我把他放大了,而且它是按照a->b->c->d->e的順序進行成長的

經過第一次成長之後,其實是將原來形狀按照生長規則,在原來的每個分支上繁殖,這裡的分支指的就是a,b,c,d,e幾個點:

其實a,b,c,d,e幾個點的實質就是生長規則

仔細看下上面的圖,其實很容易看出來,就是用原始形狀替換原來的a,b,c,d,e幾個分支,這樣就形成了第一次生長。

同理,第二次生長,其實就是在第一次生長的基礎上,用第一次生成好的圖,再去替換a,b,c,d,e,這樣就可以得到第二次生長以後的圖。

問題分析到了這裡,其實已經可以看出端倪來了。其實可以不用管成長規則:+,-,[,]

下面還是有2中方法去解體:

方法1:

第一次成長,輪詢原始的字串,找到字元'f'的地方,就用原來字串去替換,如果不是'f',就不理會

第二次成長,以第一次成長好的字串為基礎,再次輪詢,找到'f'的地方,就用原始字串去替換,如果不是'f',就不理會

依此類推,直到n次成長結束。

下面給出詳細的**,請參考:

#include

#include

#include

using namespace std;

//把最終的結果result按引用傳遞進來,seed表示原始的字串,seedlength代表原始字串的長度

void replace(string& result, const char* seed, const int seedlength)

delete symbol;   //不要忘記delete,防止記憶體洩漏

}int main(int argc, char** argv)

else

}cout << answer << endl;

return 0;}

方法2:再次考慮遞迴呼叫

最後一次生成的結果,是前一次生成的結果替換上成長規則,就是例題中的a,b,c,d,e幾個點;

一直遞迴到n等於1的時候,這時就是開始輸入的成長規則。

#include

#include

#include

using namespace std;

string answer;

string str;

int len;

void replace(int n)

int i;

for(i = 0; i < len; i++)

else}}

int main()

最後給出幾組測試資料:

4f-f++f-f

結果為:

f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f-f-f++f-f-f-f++f-f++f-f++f-f-f-f++f-f

3f+f--f+f

結果為:

f+f--f+f+f+f--f+f--f+f--f+f+f+f--f+f+f+f--f+f+f+f--f+f--f+f--f+f+f+f--f+f--f+f--f+f+f+f--f+f--f+f--f+f+f+f--f+f+f+f--f+f+f+f--f+f--f+f--f+f+f+f--f+f

3f[-f+[f-f]]

結果為:

f[-f+[f-f]][-f[-f+[f-f]]+[f[-f+[f-f]]-f[-f+[f-f]]]][-f[-f+[f-f]][-f[-f+[f-f]]+[f[-f+[f-f]]-f[-f+[f-f]]]]+[f[-f+[f-f]][-f[-f+[f-f]]+[f[-f+[f-f]]-f[-f+[f-f]]]]-f[-f+[f-f]][-f[-f+[f-f]]+[f[-f+[f-f]]-f[-f+[f-f]]]]]]

區域生長演算法

區域生長演算法 既是根據事先定義的準則將畫素或者子區域聚合成更大的區域。基本方法是以 一組 種子開始,將與種子性質相似 灰度級或顏色的特定範圍 的相鄰畫素附加到生長區域的種子上。halcon中的區域生長運算元 區域生長演算法,將圖象被分割為區域 regiongrowing image regions...

AE花紋生長

關於花紋生長的動畫,本質上來說是mask工具的使用,ae的mask工具可謂強大,比premiere好太多。第一步,將要製作成型的匯入圖層,一幅psd格式的圖一般都要好幾層,我們就是要在每個層上做動畫。這幅logo有5層,匯入到ae中。選取其中1層為例,其他層的做法完全一樣。第2步,將要做動畫的原層的...

區域生長法

區域生長的基本思想是將具有相似性質的畫素集合起來構成區域。具體先對每個需要分割的區域找乙個種子畫素作為生長的起點,然後將種子畫素周圍鄰域中與種子畫素具有相同或相似性質的畫素 根據某種事先確定的生長或相似準則來判定 合併到種子畫素所在的區域中。將這些新畫素當做新的種子畫素繼續進行上面的過程,直到再沒有...