分形
作者:
jim_9999
,
2024-11-30 16:21:39
,
所有人可见
,
阅读 2
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std ;
const int N = 1000 ;
int n, spaceCnt = 1, Len = 1 ;
bool a[N][N], back_up[N][N] ;
void cpy(int x, int y, int len) // 拷贝back_up的以(x, y)起始点,边长为len的正方形区域给a,为什么是正方形,因为一个分形就是正方形的
{
for (int i = x ; i <= len + x - 1 ; i ++ )
for (int j = y ; j <= len + y - 1 ; j ++ )
a[i][j] = back_up[i - x + 1][j - y + 1] ;
}
/*
将新的分形变成:
X X
X
X X
的样式
*/
void paint(int n)
{
if (n == 1) return ; // 结束递归,1级的分形就是X
paint(n - 1) ; // 递归下去,求n-1级的分形
Len *= 3 ; // 每次分形的级别+1时,Len就会*3
// 5个cpy表示分形中的5个"X"
cpy(1, 1, Len / 3) ;
cpy(1, Len / 3 * 2 + 1, Len / 3) ;
cpy(Len / 3 + 1, Len / 3 + 1, Len / 3) ;
cpy(Len / 3 * 2 + 1, 1, Len / 3) ;
cpy(Len / 3 * 2 + 1, Len / 3 * 2 + 1, Len / 3) ;
memcpy(back_up, a, sizeof a) ; // 将a拷贝给back_up
}
int main()
{
while (true) // 多组数据
{
cin >> n ;
a[1][1] = true ;
back_up[1][1] = true ;
if (n == -1) break ;
Len = 1 ;
paint(n) ; // 画出级别为n的矩形
for (int i = 1 ; i <= Len ; i ++ ) // 输出答案
{
for (int j = 1 ; j <= Len ; j ++ )
cout << (a[i][j] ? 'X' : ' ') ;
cout << '\n' ;
}
cout << "-\n" ;
memset(a, false, sizeof a) ; // 清除a数组,给下一组数据
}
return 0 ;
}