• 分形


    分形

    一个图形按照如下规律变换

    X
    
    X X
     X
    X X
    
    X X   X X
     X     X
    X X   X X
       X X
        X
       X X
    X X   X X
     X     X
    X X   X X
    
    X X   X X         X X   X X
     X     X           X     X
    X X   X X         X X   X X
       X X               X X
        X                 X
       X X               X X
    X X   X X         X X   X X
     X     X           X     X
    X X   X X         X X   X X
             X X   X X
              X     X
             X X   X X
                X X
                 X
                X X
             X X   X X
              X     X
             X X   X X
    X X   X X         X X   X X
     X     X           X     X
    X X   X X         X X   X X
       X X               X X
        X                 X
       X X               X X
    X X   X X         X X   X X
     X     X           X     X
    X X   X X         X X   X X
    

    询问第n个图形,(nleq 7)

    比谁更蠢的一道题目

    求证:谁更蠢

    法一:递推

    注:最蠢的作者的办法

    (f_i)为第i个图形,那么(f_i)就是由5个(f_{i-1})分别放在左上右上中间左下有下而来的,我们只要暴力复制图形即可。

    #include <iostream>
    #include <cstdio>
    #define il inline
    #define ri register
    using namespace std;
    int base[8];
    bool s[8][735][735];
    int main(){
    	s[1][1][1]=1,base[0]=1;
    	for(int i(1);i<8;++i)base[i]=base[i-1]*3;
    	for(int i(2),j,k;i<=7;++i){
    		for(j=1;j<=base[i-2];++j)
    			for(k=1;k<=base[i-2];++k)
    				s[i][j+base[i-2]][k+base[i-2]]=s[i][j+base[i-2]*2][k]=
    					s[i][j+base[i-2]*2][k+base[i-2]*2]=
    					s[i][j][k+base[i-2]*2]=s[i][j][k]=s[i-1][j][k];
    	}int n;
    	while(scanf("%d",&n),n>=0){
    		for(int i(1),j;i<=base[n-1];putchar('
    '),++i)
    			for(j=1;j<=base[n-1];++j)
    				if(s[n][i][j])putchar('X');
    				else putchar(' ');puts("-");
    	}
    	return 0;
    }
    
    

    法二:

    注:聪明的你的骚操作

    无限分形图显然需要用分治算法+递归实现是最简单,但是注意到拼接子问题的时候要暴力复制,这显然不会有人愿意去打的(除了最蠢的作者),但是如果我们保存图形的左上角的坐标来分治的话,就无需中途暴力复制了。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define il inline
    #define ri register
    using namespace std;
    int base[8];
    char s[735][735];
    void divide(int,int,int);
    int main(){
    	base[0]=1;int n;
    	for(int i(1);i<8;++i)
    		base[i]=base[i-1]*3;
    	while(scanf("%d",&n),n>=0){
    		memset(s,0,sizeof(s));
    		divide(1,1,n);
    		for(int i(1),j;i<=base[n-1];putchar('
    '),++i)
    			for(j=1;j<=base[n-1];++j)
    				if(s[i][j])putchar(s[i][j]);
    				else putchar(' ');puts("-");
    	}
    	return 0;
    }
    void divide(int y,int x,int n){
    	if(n==1)return (void)(s[y][x]='X');
    	divide(y,x,n-1);
    	divide(y,x+base[n-2]*2,n-1);
    	divide(y+base[n-2]*2,x,n-1);
    	divide(y+base[n-2],x+base[n-2],n-1);
    	divide(y+base[n-2]*2,x+base[n-2]*2,n-1);
    }
    
    

    总上所素,作者最蠢

  • 相关阅读:
    promise实现(未实现微任务)
    fastclick猜的原理
    js进制
    如何造一个好的组件库【有空就更新】
    BEM的命名
    unicode、utf-32、utf-8、utf-16
    getElementsByTagName、getElementsByClassName与querySelectorAll的区别
    为什么vue中没有事件委托/事件代理的概念
    vscode注释param
    复制dom
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11220844.html
Copyright © 2020-2023  润新知