描述
今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中的女朋友,请你帮助他实现梦想。
输入描述:
输入圣诞树的大小 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;
}