有這麼一顆樹,按照一定的規則進行成長:
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步,將要做動畫的原層的...
區域生長法
區域生長的基本思想是將具有相似性質的畫素集合起來構成區域。具體先對每個需要分割的區域找乙個種子畫素作為生長的起點,然後將種子畫素周圍鄰域中與種子畫素具有相同或相似性質的畫素 根據某種事先確定的生長或相似準則來判定 合併到種子畫素所在的區域中。將這些新畫素當做新的種子畫素繼續進行上面的過程,直到再沒有...