分形之美

焉识何物

前几天手贱点开了一道题 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[N][800*800] = {"X\0"};
char ans[N][800][800];
int a[N] = {1}, f[N] = {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[n];i++){
            if(i && i % a[n] == 0) printf("\n");
            putchar(str[n][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[N][3010][3010];
int a[N] = {1}, f[N] = {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[n];i++){
        for(int j = 0;j < a[n];j++)
            putchar(mp[n][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!一定是我瞎了,按照分形的想法搞出来的大图,是几个矩形块,而不是加长的线。这就需要手动画线了!代码略,自己玩吧:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值