这种数据范围不大的分形绘图题可以直接在一个二维数组中处理, 根据坐标绘图很水很方便.
直接以左上角一个构造好的次级分形为模板, 按要求复制到 右上 中间 左下 右下 递归即可.
打表代码有将近600KB, 提交的时候直接报错, 别问我怎么知道的…
#include<cstdio> #include<cstring> #define in inline #define re register in int read() { int s(0),b(0);char ch; do{ch=getchar();if(ch=='-')b=1;}while(ch<'0'||ch>'9'); while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48),ch=getchar(); if(b) return -s; return s; } char s[731][731]; int p[7]={1,3,9,27,81,243,729}; void out(int de) { if(de==1) {s[1][1]='X';return;} out(de-1); for(int i=1;i<=p[de-2];++i) for(re int j=1;j<=p[de-2];++j) s[i][j+2*p[de-2]]=s[i][j]; for(int i=1;i<=p[de-2];++i) for(re int j=1;j<=p[de-2];++j) s[i+p[de-2]][j+p[de-2]]=s[i][j]; for(int i=1;i<=p[de-2];++i) for(re int j=1;j<=p[de-2];++j) s[i+2*p[de-2]][j]=s[i][j]; for(int i=1;i<=p[de-2];++i) for(re int j=1;j<=p[de-2];++j) s[i+2*p[de-2]][j+2*p[de-2]]=s[i][j]; } signed main() { while(1) { memset(s,' ',sizeof(s)); int n=read(); if(n==-1) break; out(n); for(re int i=1;i<=p[n-1];++i) { for(re int j=1;j<=p[n-1];++j) printf("%c",s[i][j]); printf("\n"); } printf("-\n"); } return 0; }
最新评论