问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每行m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
个人理解:首先题中说多少行多少列的图形,最后呢,又给出了数据规模与约定,那不就是提醒我用数组嘛,因为咱们清楚,我开始定义数组时[ ]中必须要有确定的数字呗,给了我们数据规模,这不正是让我们在定义数组时更加明确一点呗,那这个题我知道用二维数组,怎么能输出这样的图案呢。
我们观察题中的例子:
观察第一行和第二行,第二行从第二个字母开始与第一行从一个字母开始往后都一样,那我肯定会输入第一行吧,因为有了第一行,我第二行才可以根据第一行的字母赋值,也就是for(i=1;i<m;i++){a[1][i]=a[0][i-1];},第二行第二列开始每一个位置的值就是斜上对角的值(该位置的行号列号分别减1),也就是以后的每一行都按这样赋值,但是呢,我又发现,第二行的第一个字母也没值呀,而且这样的话,每一行都根据上一行进行赋值的话,都缺少该行的第一个字母,那我再观察,每行的第一个字母不就是按ABCDEFG…顺序排列着么,我又开心了,那我提前把第一行和第一列都给按ABCDEFG…的顺序输入,然后从第二行第二列开始按规律一行一行的根据上一行进行赋值不就可以了呗,好啦,思路清楚了,那咱就开始趁热打铁,编起来,冲冲冲!!!
代码如下:
#include <stdio.h>
int main()
{
char a[27][27];
int m,n,i,j;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)//把第一行输入,按ABCDEFG..的顺序
a[0][i]='A'+i;
for(i=0;i<n;i++)//把第一列输入,按ABCDEFG..的顺序
a[i][0]='A'+i;
for(i=1;i<n;i++)//从第二行第二列开始,一行一行的赋值
for(j=1;j<m;j++)//每一个位置的值都是斜上对角上的值,所以就是行号列号减1
a[i][j]=a[i-1][j-1];
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
return 0;
}