题目描述
为了帮助读者更好的理解什么是n度分形宇宙,我先将程序运行结果放出来,给大家观察1度,2度,3度,4度,5度分形宇宙分别长什么样子,这样对此题涉及到的公式将会有一个更加直观的理解。
1度分形宇宙:
2度分形宇宙:
3度分形宇宙 :
4度分形宇宙:
5度分形宇宙:
相信读到这里大家都找出规律来了,题目也明确给出了n度分型宇宙递推表达式,如:
解题思路
从上图程序运行结果,我们很容易联想到可以使用一个二维的字符数组来做这道题,然后明确在这个二维字符数组中那些位置应该填入字符“X”,而哪些位置应该填空格字符,最后将次二维数组打印出来便是分形宇宙的图形,而找哪些位置应该填入字符X哪些位置应该填入字符空格的过程其实就是在题目一开头让大家做的找规律的工作,对于一个n度的分型宇宙,需要用pow(3,n-1) x pow(3,n-1)的大小的字符数组来存放该n度的分形宇宙的图形,为什么呢可以看下图我写在草稿上面的分析过程:
试着设想一下,对于任意度数的分形宇宙图形,我们只需要知道其左上角的”X“的位置坐标,即该分形宇宙的第一个字符“X”的位置,就可以根据递推式推出其它任意存放了"X“字符的位置,因为存放n度的分形宇宙的字符数组大小我们知道是pow(3,n-1) X pow(3,n-1),而分形宇宙的左上角,右上角,中间位置,左下角,右下角处又是度数更小的分形宇宙,递归即可求出所有X在二维数组中的存放位置
递推思路:要求n度的分形宇宙中存放了字符X的位置,我们需要知道n度的分型宇宙的左上角的n-1度的分形宇宙中的字符X在二维数组中的存放位置、n度的分型宇宙的右上角的n-1度的分型宇宙中字符X在二维数组中的存放位置、n度的分型宇宙中间的n-1度的分形宇宙中的字符X存放在二维字符数组中的那些位置,n度的分形宇宙左下角的n-1度的分形宇宙中的字符X存放在二维字符数组中的哪些位置以及n度的分形宇宙的右下角的n-1度的分形宇宙中的字符X存放在二维数组中的哪些位置,而对于每一个n-1度的分形宇宙我们又将其划分为更小的n-2度分形宇宙来求解。而前面我们提到只要知道这些n度的分形宇宙的左上角的位置坐标便可以求出其它的存放了字符X的位置的坐标,于是涉及出了如下递归函数来求解
void fra_universe(int x, int y, int n)
{
int distance = pow(3, n - 2);
if (n == 1)
{
fractal_universe[x][y] = 'X';
return;
}
fra_universe(x, y, n - 1); //(x,y)表示n度的分形宇宙图形的左上角的n-1度分形宇宙图形的左上角坐标
fra_universe(x + 2 * distance, y, n - 1); //(x + 2 * distance,y)表示n度的分形宇宙图形的右上角的n-1度分形宇宙图形的左上角的坐标;
fra_universe(x + distance, y + distance, n - 1); //(x + distance, y + distance)表示n度的分形宇宙图形的中间的n-1度分形宇宙图形的左上角坐标
fra_universe(x, y + 2 * distance, n - 1); //(x, y + 2 * distance)表示n度的分形宇宙图形的左下角的n-1度的分形宇宙图形的左上角的坐标
fra_universe(x + 2 * distance, y + 2 * distance, n - 1); //(x + 2 * distance, y + 2 * distance)表示n度的分形宇宙图形的右下角的n-1度分形宇宙图形的左上角坐标
}
接下来只需要将二维字符数组中那些没有填字符X的位置填上空格字符就可以将n度的分形宇宙存放在二维字符数组中了,若要将此分形宇宙显示出来,只需要将此二维字符数组打印出来即可,完整的程序代码,以及运行结果截图:
程序源代码:
//分形宇宙问题
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#define N 5
char fractal_universe[81][81]; //对于n度的分形宇宙而言,若用二维数组去存储它,那么二维数组的大小位pow(3,n-1) x pow(3,n-1)
//该算法用于实现n形宇宙问题
void fra_universe(int x, int y, int n); //n表示是几度的分形宇宙,(x,y)表示n度分形宇宙的左上角的坐标;
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int size = pow(3, n - 1);
fra_universe(0, 0, n);
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (fractal_universe[i][j] != 'X')
{
fractal_universe[i][j] = ' ';
}
printf("%c", fractal_universe[i][j]);
}
printf("\n");
}
printf("-\n");
}
return 0;
}
void fra_universe(int x, int y, int n)
{
int distance = pow(3, n - 2);
if (n == 1)
{
fractal_universe[x][y] = 'X';
return;
}
fra_universe(x, y, n - 1); //(x,y)表示n度的分形宇宙图形的左上角的n-1度分形宇宙图形的左上角坐标
fra_universe(x + 2 * distance, y, n - 1); //(x + 2 * distance,y)表示n度的分形宇宙图形的右上角的n-1度分形宇宙图形的左上角的坐标;
fra_universe(x + distance, y + distance, n - 1); //(x + distance, y + distance)表示n度的分形宇宙图形的中间的n-1度分形宇宙图形的左上角坐标
fra_universe(x, y + 2 * distance, n - 1); //(x, y + 2 * distance)表示n度的分形宇宙图形的左下角的n-1度的分形宇宙图形的左上角的坐标
fra_universe(x + 2 * distance, y + 2 * distance, n - 1); //(x + 2 * distance, y + 2 * distance)表示n度的分形宇宙图形的右下角的n-1度分形宇宙图形的左上角坐标
}
运行结果截图: