链接
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;
}