POJ2083 Fractal【分形回溯】

n度的盒分形的规模为3(n-1),即n度的盒分形图为一个长宽为3(n-1)的正方形。
设置递归函数printBox(n,x,y)生成以坐标(x,y)为左上角的n度盒分形。
1)递归边界: 若n=1,则在(x,y)输出‘X’
2)若n>1,则计算n-1度的盒子的规模 m = 3^(n-2),分别在左上方, 右上方,中间,左下方和右下方画出5个n-1度的盒子。
对于左上方的n-1度的盒子,左上角的坐标为(x,y),递归printBox(n-1,x,y)生成;
对于右上方的n-1度的盒子,左上角的坐标为(x+2m,y),递归printBox(n-1,x+2m,y)生成;
对于中间的n-1度的盒子,左上角的坐标为(x+m,y+m),递归printBox(n-1,x+m,y+m)生成;
对于左下方的n-1度的盒子,左上角的坐标为(x,y+2m),递归printBox(n-1,x,y+2m)生成;
对于右上方n-1度的盒子,左上角的坐标为(x+2m,y+2m),递归printBox(n-1,x+2m,y+2m)生成

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;

char a[735][735];

void dfs(int cur,int x,int y)
{
    if(cur==1)
    {
        a[x][y]='X';
        return ;
    }
    int s=pow(3,cur-2);
    dfs(cur-1,x,y);
    dfs(cur-1,x,y+2*s);
    dfs(cur-1,x+s,y+s);
    dfs(cur-1,x+2*s,y);
    dfs(cur-1,x+2*s,y+2*s);
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==-1)
            break;
        memset(a,' ',sizeof(a));
        dfs(n,1,1);
        int s=pow(3,n-1);
        for(int i=1;i<=s;i++)
        {
            a[i][s+1]='\0';
        }
        for(int i=1;i<=s;i++)
        {
            printf("%s\n",a[i]+1);
        }
        printf("-\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Li_Hongcheng/article/details/86563732