【分形】POJ 2083 Fractal

链接

http://poj.org/problem?id=2083

大意

给定分形规则和初始图形,求任意级别的图形

思路

模拟

代码

#include<cstdio>
using namespace std;
int n,num[12];
bool a[8][801][801];
inline void copy_right(register int x)//复制,公式可以自己推
{
    for (register int i=1;i<=num[~-x];i++)
     for (register int j=1;j<=num[~-x];j++)
      a[x][i][num[~-x]+num[~-x]+j]=a[x][i][j];
}
inline void copy_mid(register int x)
{
    for (register int i=1;i<=num[~-x];i++)
     for (register int j=1;j<=num[~-x];j++)
      a[x][num[~-x]+i][num[~-x]+j]=a[x][i][j];
}
inline void copy_down(register int x)
{
    for (register int i=1;i<=num[~-x];i++)
     for (register int j=1;j<=num[x];j++)
      a[x][i+2*num[~-x]][j]=a[x][i][j];
}
signed main()
{
    num[1]=1;
    for (register int i=2;i<=9;i++) num[i]=(num[~-i]<<1)+num[~-i];
    a[1][1][1]=1;
    for (register int i=2;i<=7;i++)//离线算法,预处理所有答案
    {
        for (register int j=1;j<=num[~-i];j++)
         for (register int k=1;k<=num[~-i];k++)
          a[i][j][k]=a[~-i][j][k];//继承上一次的答案
        copy_right(i);//向右边复制
        copy_mid(i);//向右下复制
        copy_down(i);//向下边复制
    }
    while (scanf("%d",&n),n>0)
    {
        for (register int i=1;i<=num[n];putchar(10),i++)
            for (register int j=1;j<=num[n];j++) putchar(32+a[n][i][j]*56);//输出
        putchar('-');putchar(10);//记得换行
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81635955