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

本文分享了一道分形图案打印题的解题思路及代码实现。通过递归方法,利用C语言完成了一个特定分形图案的绘制。该题旨在帮助初学者理解分形的基本概念及其递归性质。

开博客这么久从来没写过自己学校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\n");
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]='\0';
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("\n");
65         }
66     }
67     return 0;
68 }
69 /*
70 
71 
72 
73 */

 

转载于:https://www.cnblogs.com/general10/p/5938817.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值