[ An Ac a Day ^_^ ] hrbust 2291 Help C5 分形

开博客这么久从来没写过自己学校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]='';
57                     break;
58                 }
59             }
60         }
61         for(int i=1;i<=deep;i++){
62             int j=1;
63             while(a[i][j]) printf("%c",a[i][j++]);
64             printf("
");
65         }
66     }
67     return 0;
68 }
69 /*
70 
71 
72 
73 */
原文地址:https://www.cnblogs.com/general10/p/5938817.html