万众瞩目
在上一篇我们介绍了一个圣诞树的打印,而这道题与上次不同的是他的基本单位是一直在变的
我建议先把上一个搞懂在写这道题这个。
牛客网BC114 圣诞树-CSDN博客
ok那么正文开始
题目如下
今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中的女朋友,请你帮助他实现梦想。
输入描述:
输入圣诞树的大小为n
1≤n≤8
输出描述:
输出对应的圣诞树
样例一:
输入:1
输出:
*
* *
* * *
*
样例二:
输入:2
输出:
*
* *
* * *
* *
* * * *
* * * * * *
*
*
样例三:
输入:3
输出:
*
* *
* * *
* *
* * * *
* * * * * *
* *
* * * *
* * * * * *
* * * *
* * * * * * * *
* * * * * * * * * * * *
*
*
*
样例四:
输入:4
输出:
*
* *
* * *
* *
* * * *
* * * * * *
* *
* * * *
* * * * * *
* * * *
* * * * * * * *
* * * * * * * * * * * *
* *
* * * *
* * * * * *
* * * *
* * * * * * * *
* * * * * * * * * * * *
* * * *
* * * * * * * *
* * * * * * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
*
*
*
*
代码解析:
1.与上次相比我们的基本单位是一直变化的,也就是输入不同的数字,我们要先找到这个基本单位才行
2.可以发现输入n对应的基本单位就是n-1对应的图,所以可以先用循环找到基本单位
3.再找基本单位后要多次使用它,所以要先把基本单位存起来方便使用,我用的方法是二维数组。
ok有了以上的基本思路就可以开始敲代码了。
注意:一个基本变量变为下一个基本变量的过程如下
一.找基本单位
int row = 3, column = 6;//基本单位的行列
int arr[100][200] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };//存一个最小的基本变量
int count;
scanf("%d", &count);
for (int i = 1; i < count; i++)//我们知道输入n对应的图形其实也是n+1的基本单位所以我这个循环可以直接得到我们要找的图形
{
for (int j = row, J = 0; j < 2 * row; j++, J++)
for (int k = 0; k < column; k++)
{
arr[j][k] = arr[J][k];//这个是左下
arr[j][k + column] = arr[J][k];//这个是右下
arr[J][k] = '\0';这个是消除原本储存的基本单位,
}
//可以发现n的基本单位是由三个n-1的基本单位构成的,分别位于左上,右下,中上
for (int j = 0, J = row; j < row; j++, J++)
{
for (int k = 0; k < column; k++)
arr[j][k + column / 2] = arr[J][k];//这个是中上
}
row *= 2;//基本单位变大,记录的行列也要变化
column *= 2;
}
二.打印树
二维数组存储了我们的目标图形,直接打印,但要注意,我们要把数组对应元素是'\0'的打印为空格,不然你的图形就会缺一块少一块的,我的处理方法是个三目操作符来判断。
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
printf("%c", arr[i][j] == '\0' ? ' ' : arr[i][j]);
printf("\n");
}
三.打印树根
打印树根就简单了,只要直到树根在中间就行。
for (int i = 0; i < count; i++)
{
for (int j = 0; j < column / 2 - 1; j++)
printf(" ");
printf("*\n");
}
答案如下
#include<stdio.h>
int main()
{
int row = 3, column = 6;
int arr[400][1000] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };
int count;
scanf("%d", &count);
for (int i = 1; i < count; i++)
{
for (int j = row, J = 0; j < 2 * row; j++, J++)
for (int k = 0; k < column; k++)
{
arr[j][k] = arr[J][k];
arr[j][k + column] = arr[J][k];
arr[J][k] = '\0';
}
for (int j = 0, J = row; j < row; j++, J++)
{
for (int k = 0; k < column; k++)
arr[j][k + column / 2] = arr[J][k];
}
row *= 2;
column *= 2;
}
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
printf("%c", arr[i][j] == '\0' ? ' ' : arr[i][j]);
printf("\n");
}
for (int i = 0; i < count; i++)
{
for (int j = 0; j < column / 2 - 1; j++)
printf(" ");
printf("*\n");
}
return 0;
}
但是!!!!!!!
这个写法有个问题是
由于我们把要打印的n对应的图形存了进去使得内存消耗很大,下图牛客上给的
所以我们还有一种思路,就是找到n的基本单位,然后用类似于上一道题(就上一篇博客)的方法写出来
解析写在注释里了
#include<stdio.h>
int main()
{
int row = 3, column = 6;
int arr[200][400] = { {' ',' ','*',' ',' ',' '},{' ','*',' ','*',' ',' ' },{'*',' ','*',' ','*',' '} };
int count;
scanf("%d", &count);
if (count > 1)
{
for (int i = 1; i < count - 1; i++)//这里是count-1说明找的是n的基本单位,而不是n本身
{
for (int j = row, J = 0; j < 2 * row; j++, J++)
for (int k = 0; k < column; k++)
{
arr[j][k] = arr[J][k];
arr[j][k + column] = arr[J][k];
arr[J][k] = '\0';
}
for (int j = 0, J = row; j < row; j++, J++)
{
for (int k = 0; k < column; k++)
arr[j][k + column / 2] = arr[J][k];
}
row *= 2;
column *= 2;
}
//这些找基本单位过程与上一个方法一样,
for (int I = 0; I < row; I++)
{
for (int i = 0; i < column / 2; i++)
printf(" ");
for (int i = 0; i < column; i++)
printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);
printf("\n");
}
//可以发现要打印的图形都可以分为上下两部分
//这个是上面的,需要先打空格
for (int I = 0; I < row; I++)
{
for (int i = 0; i < column; i++)
printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);
for (int i = 0; i < column; i++)
printf("%c", arr[I][i] == '\0' ? ' ' : arr[I][i]);
printf("\n");
}
//这个是下面的两个基本单位构成的,不用先打空格,而且由于是两个,所以里面放了两个for循环
for (int i = 0; i < count; i++)
{
for (int j = 0; j < column - 1; j++)
printf(" ");
printf("*\n");
}
//打印树根
}
else//此方法需要将n=1设置为特例,因为找不到他的基本单位
printf(" *\n * * \n* * *\n *");
return 0;
}
很明显占用内存小了很多
总结
ok,那么牛客上两道打印圣诞树的题的就完成了,看完记得的自己动手试试瞧瞧代码哦
感觉有用的话就点个赞支持一下吧,谢谢啦