题意
传送门 POJ 2083
题解
n n n 级分形图规模为 3 n − 1 3^{n-1} 3n−1,由 5 5 5 个 n − 1 n-1 n−1 级分形图组成。设 l = 3 n − 2 l=3^{n-2} l=3n−2,子分形图顶点坐标分别为 ( 0 , 0 ) , ( 0 , 2 l ) , ( l , l ) , ( 2 l , 0 ) , ( 2 l , 2 l ) (0,0),(0,2l),(l,l),(2l,0),(2l,2l) (0,0),(0,2l),(l,l),(2l,0),(2l,2l),递归求解即可。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 750
char obj[maxn][maxn];
int qpow(int x, int n)
{
int res = 1;
while (n)
{
if (n & 1)
res *= x;
x *= x, n >>= 1;
}
return res;
}
void blk(int x, int y, int l)
{
for (int i = x; i < x + l; ++i)
for (int j = y; j < y + l; ++j)
obj[i][j] = ' ';
}
void solve(int x, int y, int l)
{
if (l == 1)
{
obj[x][y] = 'X';
return;
}
l /= 3;
solve(x, y, l), blk(x, y + l, l), solve(x, y + 2 * l, l);
blk(x + l, y, l), solve(x + l, y + l, l), blk(x + l, y + 2 * l, l);
solve(x + 2 * l, y, l), blk(x + 2 * l, y + l, l), solve(x + 2 * l, y + 2 * l, l);
}
int main()
{
int n;
while (~scanf("%d", &n) && n != -1)
{
int l = qpow(3, n - 1);
solve(0, 0, l);
for (int i = 0; i < l; ++i)
{
for (int j = 0; j < l; ++j)
putchar(obj[i][j]);
putchar('\n');
}
puts("-");
}
}