标签:
问题描述
度为 1 的箱子分形是简单的:
X
度为 2 的箱子分形是这样的:
X X
X
X X
如果用 B(n-1)表示度为 n-1 的箱子分形,那么度为 n 的箱子分形可以递归地定义为如下这样:
B(n-1) B(n-1)
B(n-1)
B(n-1) B(n-1)
你的任务是画出一个度为 n 的分形。
输入
输入包含若干组测试数据。数据的每行包含一个不大于 7 的正整数 n,输入的最后一行是一个负数 -1 表示输入的结束。
输出
对于每组测试数据,用 X 记号输出箱子分形。注意 X 是一个大写字母。在每组数据输出之后输出一个占一行的连字号。
思路
递归处理一下。要注意的是,图形末尾不要输出多于的空格,为此在 fillchar 里面填空格只要填一部分。
代码
#include <stdio.h>
#include <string.h>
const int MAXN = 1024;
char result[MAXN][MAXN];
int pow3[MAXN];
void fillchar(int n, int x, int y)
{
if (n == 1) {
result[x][y] = ‘X‘;
return ;
}
int k = pow3[n - 2];
int kk = k + k;
for (int i = 0; i < k; i++)
for (int j = 0; j < kk; j++)
result[x + i][y + j] = ‘ ‘;
for (int i = k; i < kk; i++)
for (int j = 0; j < k; j++)
result[x + i][y + j] = ‘ ‘;
for (int i = kk; i < pow3[n - 1]; i++)
for (int j = 0; j < kk; j++)
result[x + i][y + j] = ‘ ‘;
fillchar(n - 1, x, y);
fillchar(n - 1, x, y + kk);
fillchar(n - 1, x + k, y + k);
fillchar(n - 1, x + kk, y);
fillchar(n - 1, x + kk, y + kk);
}
int main()
{
pow3[0] = 1;
for (int i = 1; i < MAXN; i++)
pow3[i] = pow3[i - 1] * 3;
int n;
for (; scanf("%d", &n), n != -1; ) {
memset(result, 0, sizeof(result));
fillchar(n, 0, 0);
for (int i = 0; i < pow3[n - 1]; i++)
printf("%s\n", result[i]);
printf("-\n");
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/gu-castle/p/4982522.html