来自:@学无止境 <-----这真的大佬。。。
分形就是自相似,那么最终图腾是由多个与之相似的更小的图腾元素组成。
那么最小的元素是什么?
/\
/__\ //观察发现,此为基础组成图形,也是n=1时的图腾
将这个图形向右复制一个:
/\ /\
/__\/__\
再向上复制一个
/\
/__\
/\ /\ //我们由n=1时的图腾生成了n=2时的图腾
/__\/__\
就得到了n=2时的图腾
以此类推,因为n-1规模图腾可以生成n规模的图腾,我们可以用分治法解决更大规模的图腾,并把n=1的基础图腾预先输入,这里注意一点,‘\’ 是转义字符,这么赋值——
char c=’\’;
我们用字符矩阵存储答案,要多大呢,每复制一轮,矩阵的长与宽都翻2倍,初始n=1时,长为4,宽为2,所以定义一个1024×2048的字符矩阵就够了~~
(打表的佩服你的勇气)
还要注意一点,整个矩阵要预先赋值成空格,否则是NULL,这两个在本地输出显示是一样的,但在洛谷上会判错,到时候就出现“我在本地是对的,为什么洛谷上爆0?”的问题云云。
AC代码
#include<bits/stdc++.h>
using namespace std;
char c[1025][2050];
int main() {
int n;
cin>>n;
n--;
memset(c, ' ', sizeof(c));
c[1023][1] = '/';
c[1023][2] = '\\';
c[1024][0] = '/';
c[1024][1] = '_';
c[1024][2] = '_';
c[1024][3] = '\\';
int length = 4;
while(n--) {
for(int i = 1024;i > 1024 - length / 2 ;i--) {
for(int j = 0;j < length;j++) {
c[i - (length / 2)][j + (length / 2)] = c[i][j + length] = c[i][j];
}
}
length *= 2;
}
int k = 0;
for(int i = 1024 - length / 2 + 1;i <= 1024;i++) {
for(int j = 0;j <= length / 2 + k;j++)
printf("%c", c[i][j]);
printf("\n");
//printf("%d\n", length / 2 + k);
k++;
}
return 0;
}