*欢迎来到博主新开的专栏——牛客网题型总结
博主id:reverie_LY(reverie取名自博主最喜欢的歌my reverie哦)
如果在解题过程中遇到的问题或者有新的解题思路和方法欢迎在评论区留言或者给博主私信*
在C语言常见的编程问题中,我们经常能看到各种各样打印图案的问题。比如打印一个棱形,x型。这里博主总结了三种方法来解决此类问题
我们先来看一个题!
这个方法的思路如下,我们创建两个元素个数相同的字符组,一个我称之为“画笔”字符组,这个字符组的所有元素,都是我们图形组成的字符。比如上例中,我们的“画笔”字符组的元素都是‘*’;
第二个字符组我称为“画板”字符组,这个字符组的所有元素都是空格(‘ ’);
当我们创建好以后,我们需要将画笔字符组中的元素传给画板的元素,将画板字符组构成符合图形第一行的形式打印。
以上例为例:我们的案例是输出一个斜长度为5的x型图形,我们先判断一下字符组的元素个数是多少?这个字符组在运行过程中是不能修改大小的,所以我们需要设置的元素大小是根据最大行间距的那一行的元素个数决定的,上例中第一行的行间距最大,为5,所以画笔字符组的元素个数是5,画板字符组的元素个数也为5.
接下来则是根据具体图形将画笔元素移动至画板字符组中。我们从第一行观察。第一行的图形是画笔字符组中的第一个元素和最后一个元素移动到画板字符组中形成的
正在上传图片...
然后将新构成的画板字符组打印就形成了第一行的图形。
接着是观察图形,我们可以发现以下规律:移动给画板字符组的元素总是往中间偏移一位的。
那么我们此时就可以用一个循环语句,是画笔语句中的元素能够按照这种规则来将元素传递给画板字符组。
这里是我的解题代码
#include <stdio.h>
int main()
{
int i = 0;
while (scanf("%d", &i) != EOF)
{
int j = 0;
char ch1[i];
char ch2[i];
for (j = 0; j < i; j++)
{
ch1[j] = '\*';
ch2[j] = ' ';
}
for (j = 0; j < i; j++)
{
ch2[j] = ch1[j];
ch2[i - 1 - j] = ch1[i - 1 - j];
for (int c = 0; c < i; c++)
{
printf("%c", ch2[c]);
}
printf("\n");
for (int c = 0; c < i; c++)
{
ch2[c] = ' ';
}
}
}
return 0;
}
方如其名,就是简单粗暴的打印上去。注意的是这里的打印不是用一大堆printf函数将图形画出来,而是通过行列来判断这个位置是否要打印图形元素。以此题为例:
我们将这个图形建立坐标系:
然后设计代码,使得代码在坐标(1,1)(2,1)等位置打印*,在其余坐标打印空格(‘ ’)。
这里附上我的代码
#include <stdio.h>
int main() {
int i, j, k;
while (scanf("%d", &k) != EOF)
for (i = 0; i < k; i++)
{
if (i == 0 || i == k - 1)
{
for (j = 0; j < k; j++)
{
printf("\* ");
}
printf("\n");
} else
{
for (j = 0; j < k; j++)
{
if (j == 0 || j == k - 1)
{
printf("\* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
这个方法没什么好说的,因为这个方法是我最初想到的方法之一,后面我发现如果确定了二维字符组的元素的话,使用直接打印法更加简单。
二维字符组本身就具备完全存放整个二维图形的能力,我们只需要能够赋值给二维数组中去也行。以上题为例
我们只要能够把二维数组赋值成
char ch[4][4] = { "****",
"* *",
"* *",
"****" };
然后按照格式打印即可:关于赋值的方法与上面的方法类似。(甚至可以说是创建这个二维数组就是多次一举--+)。
这里附上代码
#include <stdio.h>
int main() {
int i, j, k;
while (scanf("%d", &k) != EOF)
{
char ch[k][k];
for (i = 0; i < k; i++)
{
if (i == 0 || i == k - 1)
{
for (j = 0; j < k; j++)
{
ch[i][j]='*';
}
} else
{
for (j = 0; j < k; j++)
{
if (j == 0 || j == k - 1)
{
ch[i][j]='*';
} else
{
ch[i][j]=' ';
}
}
}
}
for(i=0;i<k;i++)
{
for(j=0;j<k;j++)
{
printf("%c ",ch[i][j]);
}
printf("\n");
}
}
return 0;
}
除此之外还有一个缺点就是内存占用会远超第二种方式,所以做这种类型题时,推荐第二种方法.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。