zoukankan      html  css  js  c++  java
  • 分形

    分形

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

    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);
    }
    
    

    总上所素,作者最蠢

  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11220844.html
Copyright © 2011-2022 走看看