标签:
问题描述
度为 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