【C++题解】BC115 超级圣诞树 | 递归

本文详细介绍了如何使用递归算法创建BC115超级圣诞树,通过示例展示了树冠结构的递归关系以及如何计算节点在直角坐标系中的位置,提供了C++代码实现。
摘要由CSDN通过智能技术生成

一、题目

BC115 超级圣诞树

二、思路(递归)

(以n=1、n=2及n=3为例)

1、首先观察n=1、n=2及n=3的圣诞树树冠

在这里插入图片描述
树冠部分具有很明显的递归关系
当n=1时为函数出口,此时打印一个黄色三角;
当n=2时,递归调用三次函数,分别打印三个黄色三角;
当n=3时,递归调用三次函数,分别打印三个红色三角;

打印所需的参数为:树、n、黄三角的顶点位置
设计函数为setTree( tree, n, (顶点位置))

下一步求顶点位置:

2、建立直角坐标系建立节点的位置关系

在这里插入图片描述

(1)整棵树顶点坐标

x0 = 3 * pow(2, n-1) - 1
y0 = 0

(2)子树顶点坐标

x = x0 - 3 * pow(2, (n - 1) - 1)或 x = x0 + 3 * pow(2, (n - 1) - 1)
y = y0 + 3 * pow(2, (n - 1) - 1)

(3)树干坐标

x = x0
y = 3 * pow(2, n-1) 到 (3 * pow(2, n-1)) + n - 1

三、代码

#include <iostream>
#include <math.h>
using namespace std;

void setTree(char tree[][800], int n, int y, int x) {    //(y,x)为顶点坐标
    if (n == 1) {
        tree[y][x] = '*';
        tree[y + 1][x - 1] = '*';     tree[y + 1][x + 1] = '*';
        tree[y + 2][x - 2] = '*';     tree[y + 2][x] = '*';       tree[y + 2][x + 2] = '*';
    }
    else {
        setTree(tree, n - 1, y, x);
        setTree(tree, n - 1, y + 3 * pow(2, (n - 1) - 1), x - 3 * pow(2, (n - 1) - 1));
        setTree(tree, n - 1, y + 3 * pow(2, (n - 1) - 1), x + 3 * pow(2, (n - 1) - 1));
    }
}

int main() {
    int n;  //圣诞树size
    cin >> n;
    //计算圣诞树尺寸:行<=392,列<=767
    char tree[400][800] = { 0 };
    //计算圣诞数中轴线位置,顶点的x坐标
    int x = 3 * pow(2, n - 1) - 1; //第一列列号为0
    int y = 0;

    setTree(tree, n, y, x); //调用递归设置树冠

    //设置树干
    int pos_y = 3 * pow(2, n - 1);
    for (int i = 0; i < n; i++) {
        tree[pos_y+i][x] = '*';
    }
    //打印圣诞树
    for (int i = 0; i < (3 * pow(2, n - 1) + n); i++) {
        for (int j = 0; j < 3 * pow(2, n)-1; j++) {
            if (tree[i][j] == '*')
                cout << tree[i][j];
            else cout << " ";
        }
        cout << endl;
    }
    return 0;
}

^_^~

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值