容桂均安网站建设,网站开发公司赚钱么,东莞网站改版,什么亲子网站可以做一下广告词万众瞩目 在上一篇我们介绍了一个圣诞树的打印#xff0c;而这道题与上次不同的是他的基本单位是一直在变的
我建议先把上一个搞懂在写这道题这个。
牛客网BC114 圣诞树-CSDN博客
ok那么正文开始
题目如下
今天是圣诞节#xff0c;牛牛要打印一个漂亮的圣诞树送给想象中… 万众瞩目 在上一篇我们介绍了一个圣诞树的打印而这道题与上次不同的是他的基本单位是一直在变的
我建议先把上一个搞懂在写这道题这个。
牛客网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对应的图形其实也是n1的基本单位所以我这个循环可以直接得到我们要找的图形{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);}
答案如下
#includestdio.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的基本单位然后用类似于上一道题就上一篇博客的方法写出来
解析写在注释里了
#includestdio.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//此方法需要将n1设置为特例因为找不到他的基本单位printf( *\n * * \n* * *\n *);return 0;
} 很明显占用内存小了很多
总结
ok那么牛客上两道打印圣诞树的题的就完成了看完记得的自己动手试试瞧瞧代码哦
感觉有用的话就点个赞支持一下吧谢谢啦