1. 程式人生 > >【遞歸】分形

【遞歸】分形

++ 幾何 isp space sed hide 表示 std event

題目描述

分形,具有以非整數維形式充填空間的形態特征。通常被定義為“一個粗糙或零碎的幾何形狀,可以分成數個部分,且每一部分都(至少近似地)是整體縮小後的形狀”,即具有自相似的性質。

技術分享圖片
盒型分形定義如下: 度數為1的分形為: X 度數為2的分形為: X X X X X 如果用B(n-1)代表度數為n-1的盒型分形,則度數為n的盒型分形可以遞歸的定義為: B(n-1) B(n-1) B(n-1)
B(n-1) B(n-1) 你的任務是輸出度數為n的盒型分形。

輸入

輸入包含多個測試數據,每個測試數據占一行,包含一個正整數n,(n<=7)。輸入最後一行為-1,表示結束。

輸出

對每個測試數據,用X表示輸出的盒型,每個測試數據對應的輸出結果後輸出一串"----------",每行的末尾不要輸出任何多余的空格,否則得到的是格式錯誤的結果。

樣例輸入

1
2
3
4
-1

樣例輸出

X
----------
X X
 X
X X
----------
X X   X X
 X     X
X X   X X
   X X
    X
   X X
X X   X X
 X     X
X X   X X
----------
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
         X X   X X
          X     X
         X X   X X
            X X
             X
            X X
         X X   X X
          X     X
         X X   X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
----------


技術分享圖片
 1 #include <iostream>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 char mapp[800][800];               //記錄圖形
 5 void solve(int n,int x,int y)
 6 {
 7     if(n==1)
 8     {
 9         mapp[x][y]=X;
10     }
11     else
12     {
13         int sizee=pow(3.0,n-2);          
14 solve(n-1,x,y); //遞歸 15 solve(n-1,x+sizee*2,y); 16 solve(n-1,x+sizee,y+sizee); 17 solve(n-1,x,y+sizee*2); 18 solve(n-1,x+sizee*2,y+sizee*2); 19 } 20 } 21 int main() 22 { 23 int n; 24 while(cin>>n) 25 { 26 if(n==-1) 27 break; 28 int m=pow(3.0,n-1); //m為圖形大小 29 for(int i=0;i<m;i++) 30 { 31 for(int j=0;j<m;j++) 32 mapp[i][j]= ; //初始化 33 } 34 for(int i=0;i<m;i++) 35 { 36 mapp[i][m]=\0; 37 } 38 solve(n,0,0); 39 for(int i=0;i<m;i++) 40 { 41 for(int j=m-1;j>=0;j--) 42 { 43 if(mapp[i][j]==X) //若為X則該行遍歷結束 44 break; 45 else if(mapp[i][j]!=X) //若非X則賦為‘\0‘ 46 mapp[i][j]=\0; 47 } 48 } 49 for(int i=0;i<m;i++) 50 printf("%s\n",mapp[i]); 51 printf("----------\n"); 52 } 53 return 0; 54 }
View Code

【遞歸】分形