递归分形
Posted mxzf0213
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归分形相关的知识,希望对你有一定的参考价值。
【递归】分形
题目描述
分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。
盒型分形定义如下:
度数为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
----------
分析:递归
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include <ext/rope> #define rep(i,m,n) for(i=m;i<=n;i++) #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++) #define vi vector<int> #define pii pair<int,int> #define mod 1000000007 #define inf 0x3f3f3f3f #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) const int maxn=1e3+10; const int dis[][2]={{0,1},{-1,0},{0,-1},{1,0}}; using namespace std; using namespace __gnu_cxx; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;} char a[maxn][maxn]; int len; void dfs(int l1,int l2,int r1,int r2) { if(l1==0)return; int l=l2-l1+1; for(int i=l1;i<=l2;i++) for(int j=r1;j<=r2;j++) a[i-l][j-l]=a[i-l][j+l]=a[i+l][j-l]=a[i+l][j+l]=a[i][j]; dfs(l1-l,l2+l,r1-l,r2+l); } int main() { int i,j,m,n,k,t; while(~scanf("%d",&n)&&n!=-1) { memset(a,‘ ‘,sizeof(a)); len=1; for(i=1;i<n;i++)len=len*3; a[len/2][len/2]=‘X‘; dfs(len/2,len/2,len/2,len/2); for(i=0;i<len;i++) { for(j=len;a[i][j]==‘ ‘;j--); a[i][j+1]=0; printf("%s\n",a[i]); } puts("----------"); } //system("pause"); return 0; }
以上是关于递归分形的主要内容,如果未能解决你的问题,请参考以下文章