题目描述
今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中的女朋友,请你帮助他实现梦想。
算法
使用递归的思路解决。除去树根的部分,圣诞树可以看作由基本部分
组成。每个基本部分的左下角和右下角又是又上述基本部分组成。
首先,准备一块字符数组,初始化为空格。记n为圣诞树层数,计算需要的空间为:
X的范围 [ 0, n*3+n], Y的范围 [ 0, n*6-1]
然后,确定递归基,当前层数来到n层时,递归结束,打印树根部分。为了避免重复递归调用,当递归函数发现某一层操作之前已经做过,即这部分的树已经画过,就直接返回。接下来递归的画左树和右树。
实现
这里画了10层,牛牛应该开心了。
#include <iostream>
#include <vector>
using namespace std;
void draw_one_tree(int x,int y,int n,int cur, vector<vector<char>>& map)
{
if (cur >= n)
{
if (map[n * 3 + n - 1][(n * 6 - 1) / 2] != '*')
for (int i = n * 3 + n-1; i >= n * 3 ; --i)
{
map[i][(n * 6 - 1) / 2]='*';
}
return;
}
if (map[x][y] == '*')return;
draw_one_tree(x+3, y+3, n, cur+1, map);
draw_one_tree(x+3, y-3, n, cur+1, map);
map[x][y] = '*';
map[x + 1][y + 1] = '*';
map[x + 1][y - 1] = '*';
map[x + 2][y] = '*';
map[x + 2][y + 2] = '*';
map[x + 2][y - 2] = '*';
}
int main() {
int n = 10;
vector<vector<char>> arr(n*3+n,vector<char>(n*6-1,' '));
draw_one_tree(0, (n * 6 - 1) / 2, n, 0, arr);
//打印
for (int j = 0; j < n * 3 + n; j++)
{
for (int i = 0; i < n * 6 - 1; i++)
{
cout << arr[j][i];
}
cout << endl;
}
}