第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 字母图形
前言
最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是dp分析能力了,所以就主要目标定在这里,最近的题目会很散,很多,基本上都是网罗全网的一些dp练习题进行二次训练,准备比赛的学生底子薄的先不建议看啊,当然,脑子快的例外,可以直接跳过之前的一切直接来看即可,只需要你在高中的时候数学成绩还可以那就没啥问题,其实,dp就是规律总结,我们只需要推导出对应题目的数学规律就可以直接操作,可能是一维数组,也可能是二维数组,总体来看二维数组的较多,但是如果能降为的话建议降为,因为如果降为起来你看看时间复杂度就知道咋回事了,那么在这里祝大家能无序的各种看明白,争取能帮助到大家。
基础练习 字母图形
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26
题解:
这个题目的规律还是很容易找到的,就是根据输入的两个数,第一个数n是行数,第二个数m是列数,行数挨个排序就行,首字母逐一向后排;列数控制着字符应该最大显示长度。
C语言
别看代码多,但是规律是很明显的。
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 26 //输出 void Print(char matrix[MAXSIZE][MAXSIZE],int n,int m) { int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("%c",matrix[i][j]); } printf("\n"); } } //实现字母图形 void Drawing(int n,int m) { int i,j; int point=0; char str; char matrix[MAXSIZE][MAXSIZE]; for(i=0;i<n;i++) { str='A'; for(j=i;j<m;j++) { matrix[i][j]=str++; } str='A'; for(j=i-1;j>=0;j--) { matrix[i][j]=++str; } } Print(matrix,n,m); } int main() { int n,m; scanf("%d%d",&n,&m); Drawing(n,m); return 0; }
C++语言
能简洁一些还是很不错的。
#include <iostream> #include <cmath> using namespace std; int main() { int n, m; cin >> n >> m; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) cout << char('A'+abs(i-j)); cout << endl; } return 0; }
Java语言
这里可以看到对坐标的处理方法,建议通过绘图的方式来解决这个题目。
import java.io.*; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); sc.close(); char[][] a = new char[n][m]; a[0][0] = 'A'; for (int i = 1; i < n; i++) a[i][0] = (char) (a[i - 1][0] + 1); for (int i = 1; i < m; i++) a[0][i] = (char) (a[0][i - 1] + 1); for (int i = 1; i < n; i++) for (int j = 1; j < m; j++) a[i][j] = a[i - 1][j - 1]; for (char[] i : a) { for (char j : i) { System.out.print(j); } System.out.println(); } } }
Python语言
Python相对来说由于是弱类型的变量,在处理一些内容的时候是非常方便的,根本不需要考虑各种变量类型之间的变化问题。
m,n = map(int,input().split()) for i in range(1,m+1): for j in range(1,n+1): if j == n: print(chr(abs(i-j)+65),end='\n') else: print(chr(abs(i-j)+65),end='')
总结
这个题目也算是一个坐标题目,多做做坐标题目是非常有好处的,后面解题很多很多都是各种坐标的处理呢。
没有什么不付出就能拿到的结果,我们都是在负重前行,最终结果与自身先天的脑力有一定的关系,但是还是有很大一部分看自己后天的努力,其实从报名到比赛也就5个月左右,真正刷题的事件也就2个月,2个月回忆一下你真正的认真刷过题吗,如果你真的用尽所有的精力去努力了,那么我相信你最终的成绩一定会让你满意的,加油。