开博客这么久从来没写过自己学校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~
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<bitset>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<queue>
#include<list>
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=2e3+;
const int mod=1e7+;
int dx[]= {,,,-,,-,,-};
int dy[]= {,-,,,-,,,-};
//---------------------------------------ヽ(^。^)丿
char a[maxn][maxn]; void make(int x,int y,int deep){
if(deep==){
a[x-][y]=' ',a[x-][y+]='C',a[x-][y+]='C';
a[x][y]='C';
a[x+][y]=' ',a[x+][y+]='C',a[x+][y+]='C';
return ;
}
int _deep=(int)(pow(,deep-)+0.5);
make(x-_deep,y+_deep,deep-);
make(x-_deep,y+_deep+_deep,deep-);
make(x,y,deep-);
make(x+_deep,y+_deep,deep-);
make(x+_deep,y+_deep+_deep,deep-);
} int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
M(a,' ');
if(n==){
printf("C\n");
continue;
}
int deep=(int)(pow(,n)+0.5);
make(deep/+,,n);
for(int i=;i<=deep;i++){
for(int j=deep;j>=;j--){
if(a[i][j]=='C'){
a[i][j+]='\0';
break;
}
}
}
for(int i=;i<=deep;i++){
int j=;
while(a[i][j]) printf("%c",a[i][j++]);
printf("\n");
}
}
return ;
}
/* */