开博客这么久从来没写过自己学校oj的题解 今天写一篇吧 嘿嘿
原题链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2291
这是我大一的第一次校赛的题目 接触的第一道分形题 当时还想傻傻的printf……
这道题oj上开2200*2200就可以了 实际上是6500*6500的样子……
分形重要的是找到递归的基础点 然后根据基础点去描述图形 然后完成打印
比如这道题的图案
CC
C
CC
我选的是第二行唯一一个C作为基础点
设_deep为下一层图案的大小
那么五个递归点就可以分别描述为(竖着的是x轴 横着的是y轴 这就是个二维数组嘛)
(x-deep,y+deep) (x-deep,y+2*deep)
(x,y)
(x+deep,y+deep) (x-deep,y+2*deep)
然后递归打印就可以了^_^~
可以当deep=0时输出 也可以deep=1时输出
为了区别一下我是自己写的 我就deep=1了 2333~
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 #include<bitset> 8 #include<map> 9 #include<set> 10 #include<stack> 11 #include<vector> 12 #include<queue> 13 #include<list> 14 #define M(a,b) memset(a,b,sizeof(a)) 15 using namespace std; 16 typedef long long ll; 17 const int inf=0x3f3f3f3f; 18 const int maxn=2e3+200; 19 const int mod=1e7+7; 20 int dx[8]= {0,0,1,-1,1,-1,1,-1}; 21 int dy[8]= {1,-1,0,0,-1,1,1,-1}; 22 //---------------------------------------ヽ(^。^)丿 23 char a[maxn][maxn]; 24 25 void make(int x,int y,int deep){ 26 if(deep==1){ 27 a[x-1][y]=' ',a[x-1][y+1]='C',a[x-1][y+2]='C'; 28 a[x][y]='C'; 29 a[x+1][y]=' ',a[x+1][y+1]='C',a[x+1][y+2]='C'; 30 return ; 31 } 32 int _deep=(int)(pow(3,deep-1)+0.5); 33 make(x-_deep,y+_deep,deep-1); 34 make(x-_deep,y+_deep+_deep,deep-1); 35 make(x,y,deep-1); 36 make(x+_deep,y+_deep,deep-1); 37 make(x+_deep,y+_deep+_deep,deep-1); 38 } 39 40 int main(){ 41 int T; 42 scanf("%d",&T); 43 while(T--){ 44 int n; 45 scanf("%d",&n); 46 M(a,' '); 47 if(n==0){ 48 printf("C "); 49 continue; 50 } 51 int deep=(int)(pow(3,n)+0.5); 52 make(deep/2+1,1,n); 53 for(int i=1;i<=deep;i++){ 54 for(int j=deep;j>=1;j--){ 55 if(a[i][j]=='C'){ 56 a[i][j+1]='