您的位置:首页 > 其它

分形之美

2016-05-23 12:34 323 查看

焉识何物

前几天手贱点开了一道题 POJ 2083想着简单的递归就可以吧。只是一开始的方法非常蠢!把一个子图用string存下来,然后构造下一个等级的图。将3*3的子图拼成一个大图,我是一行一行扫进来的……于是如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 7
char str
[800*800] = {"X\0"};
char ans
[800][800];
int a
= {1}, f
= {1};
string tmp, blank;
string gao(string as, string bs, string cs, int d){
string r = "";
for(int i = 0;i < d;i++){
for(int j = 0;j < d;j++)
r += as[i*d+j];
for(int j = 0;j < d;j++)
r += bs[i*d+j];
for(int j = 0;j < d;j++)
r += cs[i*d+j];
}
return r;
}
int main()
{
for(int i = 1;i < N;i++)
a[i] = a[i-1] * 3;
for(int i = 0;i < N;i++)
f[i] = a[i] * a[i];
for(int i = 1;i < N;i++){
blank = tmp = "";
for(int j = 0;j < f[i-1];j++){
tmp += str[i-1][j];
blank += ' ';
}
tmp = gao(tmp, blank, tmp, a[i-1]) + gao(blank, tmp, blank, a[i-1]) + gao(tmp, blank, tmp, a[i-1]);
for(int j = 0;j < f[i];j++)
str[i][j] = tmp[j];
}
int n;
while(~scanf("%d", &n)){
if(n == -1) break;
n--;
for(int i = 0;i < f
;i++){
if(i && i % a
== 0) printf("\n");
putchar(str
[i]);
}
printf("\n-\n");
}
return 0;
}


分形乍现

感觉挺丑陋的,然后看了discuss,意外发现了另一道题 POJ 3678,这下子不能丑陋地按行扫描了!说到分形,记起来了几个漂亮的图。把一个最简单的子图成为雏形,那么大图整体形状就是一个雏形的放大版。填充子图进去的时候,只要标明放置的位置和放大的比例,即可填成一大图。有点递归的意思,于是就这么短……

/*--------------------------------------------
* File Name: POJ 3678
* Author: Danliwoo
* Mail: Danliwoo@outlook.com
* Created Time: 2016-05-23 12:25:53
--------------------------------------------*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 7
char mp
[3010][3010];
int a
= {1}, f
= {1};
void pt(int x, int y, int d){
for(int i = 0;i < a[d];i++)
for(int j = 0;j < a[d];j++)
mp[d+1][x+i][y+j] = mp[d][i][j];
}
void dfs(int n){
if(n == 0) return;
dfs(n-1);
for(int i = 0;i < a[0];i++)
for(int j = 0;j < a[0];j++)
if(mp[0][i][j] != ' ')
pt(i*a[n-1], j*a[n-1], n-1);
}
void pr(int n){
for(int i = 0;i < a
;i++){
for(int j = 0;j < a
;j++)
putchar(mp
[i][j]);
printf("\n");
}
}
int main(){
int n, m;
while(scanf("%d", &n), n){
getchar();
for(int i = 0;i < n;i++)
gets(mp[0][i]);
a[0] = strlen(mp[0][0]);
f[0] = a[0] * a[0];
scanf("%d", &m);
for(int i = 1;i < m;i++){
a[i] = a[i-1] * a[0];
f[i] = a[i] * a[i];
}
for(int k = 1;k < m;k++)
for(int i = 0;i < a[k];i++){
for(int j = 0;j < a[k];j++)
mp[k][i][j] = ' ';
}
dfs(m-1);
pr(m-1);
}
return 0;
}


欺人禄蠹

蠢蠢地想起来曾经遇到过的一道需要递归搞的题 ZOJ 3839,以为这是分形,哦,no!一定是我瞎了,按照分形的想法搞出来的大图,是几个矩形块,而不是加长的线。这就需要手动画线了!代码略,自己玩吧:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: