【递归】分形

题目描述

分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。


盒型分形定义如下:
度数为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

 

posted @ 2018-01-27 21:53  听风不成泣  阅读(369)  评论(0编辑  收藏  举报