问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
看这道题目,就26个英文字母,我们申请一个数组大小的27的字符空间,存进去就行了(我这里从arry[1]开始储存,方便使用 ),(偷懒办法)。首先可以想到需要两层循环去控制输出,观察题目,每行的首字母都是有顺序,首字母在字符数组的位置就是行数。
然后观察从A开始只有第一行,其余行都是先靠近A,然后远离A,给一个中间变量,决定是靠近A还是远离,看代码吧
#include <iostream>
#include <string>
using namespace std;
int main()
{
char arry[27];
int i,j,k=1;
char flag = 65; //字符A的ascii码
for (i = 1; i <= 26; i++)
{
arry[i] = flag++; //字符数组赋值
}
int m, n; //行 列
int num=0; //记录输出列数
int temp; //记录输出首字母下标
cin >> m >> n;
for (i = 1; i <= m; i++) //控制行输出
{
temp = i; //第几行首字母就是第几个字母
k = 1;
num = 0;
while (temp != 1&&num<n)
//第n行,首字母就输出第几个,然后慢慢靠近A,也就是下标temp--,
//但是要保证列数的准确,假如是4行2列,temp--之后第四行应该是DCBA,
//但我们只需要两列,所以 num<n 保证列数正确。
{
cout << arry[temp--];
num++; //记录列数
}
while(num<n) //同上解法 保证列数
{
//上面的while循环是靠近A输出,这段代码是远离A的输出
//下标k初始化为1,远离A就很好办,k++就好。
cout << arry[k++];
num++; //记录列数
}
cout << endl;
}
}
自我认为,我写的还算详细,一个只会c/v的菜鸡,时间紧迫,就写到这里,祝大家蓝桥杯都nb!!
如果发现错误,或者更好的优化,评论私信都可!! 虚心接受一切指导。