超级圣诞树

描述

今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中的女朋友,请你帮助他实现梦想。

输入描述:

输入圣诞树的大小 nn

1≤n≤81≤n≤8

输出描述:

输出对应的圣诞树

例子:

输入:

1

输出:

  *
 * *
* * *
  *

输入:

2

输出:

     *
    * *
   * * *
  *     *
 * *   * *
* * * * * *
     *
     *

输入:

3

输出:

           *
          * *
         * * *
        *     *
       * *   * *
      * * * * * *
     *           *
    * *         * *
   * * *       * * *
  *     *     *     *
 * *   * *   * *   * *
* * * * * * * * * * * *
           *
           *
           *

输入:

4

输出:

                       *
                      * *
                     * * *
                    *     *
                   * *   * *
                  * * * * * *
                 *           *
                * *         * *
               * * *       * * *
              *     *     *     *
             * *   * *   * *   * *
            * * * * * * * * * * * *
           *                       *
          * *                     * *
         * * *                   * * *
        *     *                 *     *
       * *   * *               * *   * *
      * * * * * *             * * * * * *
     *           *           *           *
    * *         * *         * *         * *
   * * *       * * *       * * *       * * *
  *     *     *     *     *     *     *     *
 * *   * *   * *   * *   * *   * *   * *   * *
* * * * * * * * * * * * * * * * * * * * * * * *
                       *
                       *
                       *
                       *

这是一道循环输出图形的题目,与三子棋,扫雷有些类似。

解题思路:

取现有的图形单元进行复制:

1.应该确定此图形最上端的*的下标,通过找规律,不难发现,顶点的下标志满足3*(2^n)-1,其

中n为从键盘输入的值。

2.创建一个二维字符数组,将此图形的一个最小单元按顶点存入二维数组中,作为一个复制单

元。

3.进行循环,第一次循环,将最上面的三角形复制到对应其左下的三角形位置右下的三角形位置

如果有第二次循环,则将三个小三角形构成的三角形作为新的复制单元,分别赋值到对应其左下的

三角形位置右下的三角形位置。

4.打印图形:

(1)打印树叶:

遍历字符数组,如果=‘*’,则输出,否则输出‘ ’。

(2)打印树干。

代码实现:

1.应该确定此图形最上端的*的下标,通过找规律,不难发现,顶点的下标志满足3*(2^n)-1,其

中n为从键盘输入的值。

int n = 0;
	char arr[800][800] = { 0 };
	scanf("%d", &n);
	int y = 3 * pow(2, n - 1) - 1;
	arr[0][y] = '*';
	arr[1][y - 1] = '*';
	arr[1][y + 1] = '*';
	arr[2][y] = '*';
	arr[2][y - 2] = '*';
	arr[2][y + 2] = '*';

2.创建一个二维字符数组,将此图形的一个最小单元按顶点存入二维数组中,作为一个复制单

元。

int n = 0;
	char arr[800][800] = { 0 };
	scanf("%d", &n);
	int y = 3 * pow(2, n - 1) - 1;
	arr[0][y] = '*';
	arr[1][y - 1] = '*';
	arr[1][y + 1] = '*';
	arr[2][y] = '*';
	arr[2][y - 2] = '*';
	arr[2][y + 2] = '*';

3.进行循环,第一次循环,将最上面的三角形复制到对应其左下的三角形位置右下的三角形位置

如果有第二次循环,则将三个小三角形构成的三角形作为新的复制单元,分别赋值到对应其左下的

三角形位置右下的三角形位置。

for (int i = 0; i < n; i++)
	{
		int row = (3 * pow(2, i - 1) - 1);
		for (int x1 = 0; x1 <= row; x1++)
		{
			for (int y1 = y - row; y1 <= y + row; y1++)
			{
				arr[x1 + row + 1][y1 - row - 1] = arr[x1][y1];
			}
		}
		for (int x1 = 0; x1 <= row; x1++)
		{
			for (int y1 = y - row; y1 <= y + row; y1++)
			{
				arr[x1 + row + 1][y1 + row + 1] = arr[x1][y1];
			}
		}
	}

4.打印图形:

(1)打印树叶:

遍历字符数组,如果=‘*’,则输出,否则输出‘ ’。

for (int i = 0; i <= 3 * pow(2, n - 1) - 1; i++)
	{
		for (int j = 0; j <= 3 * pow(2, n)-2; j++)
		{
			if (arr[i][j] == '*')
			{
				printf("%c", arr[i][j]);
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
	}

(2)打印树干。

for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < y; j++)
		{
			printf(" ");
		}
		printf("*\n");
	}

代码实现如下:

#include<math.h>
int main()
{
	int n = 0;
	char arr[800][800] = { 0 };
	scanf("%d", &n);
	int y = 3 * pow(2, n - 1) - 1;//顶点位置
	arr[0][y] = '*';
	arr[1][y - 1] = '*';
	arr[1][y + 1] = '*';
	arr[2][y] = '*';
	arr[2][y - 2] = '*';
	arr[2][y + 2] = '*';
	//循环复制,如果有多次循环,更新复制单元
	for (int i = 0; i < n; i++)
	{
		int col = (3 * pow(2, i - 1) - 1);
		for (int x1 = 0; x1 <= col; x1++)
		{
			for (int y1 = y - col; y1 <= y +col; y1++)
			{
				arr[x1 + col + 1][y1 - col - 1] = arr[x1][y1];
			}
		}
		for (int x1 = 0; x1 <= col; x1++)
		{
			for (int y1 = y - col; y1 <= y + col; y1++)
			{
				arr[x1 + col + 1][y1 + col + 1] = arr[x1][y1];
			}
		}
	}
	//打印树叶
	for (int i = 0; i <= 3 * pow(2, n - 1) - 1; i++)
	{
		for (int j = 0; j <= 3 * pow(2, n)-2; j++)
		{
			if (arr[i][j] == '*')
			{
				printf("%c", arr[i][j]);
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
	}
	//打印树干
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < y; j++)
		{
			printf(" ");
		}
		printf("*\n");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值