蓝桥杯练习——基础训练
字母图形
【问题描述】
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
【输入格式】
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
【输出格式】
输出n行,每个m个字符,为你的图形。
【样例输入】
5 7
【样例输出】
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
【数据规模与约定】
1 <= n, m <= 26。
思路
整体就是,每行以A为基准,然后向两边一边增大一边填数,思路很简单,但是实操就。。
咋说呢,一开始写了个运行错误的代码,有三组比较奇葩的数据没过。因为我一开始的思路是先把每行行号列号相等的地方把A填完了然后再填别的,结果有的数据列号比行号小,这个方法就不行了
(错误版本)
import java.util.Scanner;
public class ZimuPicWA {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n,m,i,j,k;
char c='B';
n=scanner.nextInt();
m=scanner.nextInt();
char ch[][]=new char[n+1][m+1];
for(i=1;i<=n;i++) {
ch[i][i]='A';
for(j=i+1;j<=m;j++) {
ch[i][j]=c;
c++;
}
c='B';
for(k=i-1;k>=1;k--) {
ch[i][k]=c;
c++;
}
c='B';
}
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++) {
System.out.print(ch[i][j]);
}
System.out.println();
}
}
}
于是改变一下思路,不要先把A填完,而是随着循环每遇到一个数就去判断,这样就不会出现数组超界的情况。
对于j大于i的部分横向比较并填数,j小于i的部分竖向比较并填数。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int m=scanner.nextInt();
char ch[][]=new char[n+1][m+1];
int i,j;
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++) {
if(i==j) {
ch[i][j]='A';
}
else if(i>j) {
ch[i][j]=(char) (ch[i-1][j]+1);
}
else {
ch[i][j]=(char) (ch[i][j-1]+1);
}
}
}
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++) {
System.out.print(ch[i][j]);
}
System.out.println();
}
}
}