分形

分形

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

X

X X
 X
X X

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

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

总上所素,作者最蠢

原文地址:https://www.cnblogs.com/a1b3c7d9/p/11220844.html