C++ 蓝桥杯题目讲解汇总(持续更新)
字母图形
资源限制
时间限制:1.0 s 内存限制:256.0 MB
问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
思路
首先由题目可以分析出以下规律
- 每一行的首字符都是第i个字符
- 可以分为两部分
- 第一部分是倒着的,从第i个字符开始倒着到第0个,共i-0+1个,最多m个
- 第二部分是正着的,从第1个字符开始(否则第0个字符会重复),这部分共m-i-1个,最多m个
代码-C++
#include <iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
string str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i=0;i<n;i++){
string res = "";
//第一部分
for (int j=i;j>i-m;j--){
if (j<0) break;
res+=str1[j];
}
第二部分
for (int k=1;k<m-i;k++){
res+=str1[k];
}
cout<<res<<endl;
//在两个循环内也可以直接cout,可以不用res
}
return 0;
}
总结
在实际操作过程中,第一遍并没有ac掉,后来我结合数据检查了一下,主要是第一部分中的长度超过了m的限制(当时的错误是j=i;j>0),导致并没有正确,70分,后来直接sub.str(0,2)也是可以直接弥补这部分的错误。不过还是重新理了一下错误原因,并在我的思路的第一部分重新写进去,限制长度为m,同时break是为了防止C++切片操作如:str[负数] 得到的是“ ”,所以break限制。
我后来在其他作者的博客上,找到一个巧妙的规律,其博客地址如下,讲的挺细的可以看一下:
https://blog.csdn.net/richenyunqi/article/details/84261936