一、题目
二、思路(递归)
(以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;
}
^_^~