万众瞩目
在上一篇我们介绍了一个圣诞树的打印,而这道题与上次不同的是他的基本单位是一直在变的
我建议先把上一个搞懂在写这道题这个。
牛客网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,那么牛客上两道打印圣诞树的题的就完成了,看完记得的自己动手试试瞧瞧代码哦
感觉有用的话就点个赞支持一下吧,谢谢啦