题目:
问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
前言:
我觉题目出得不太严谨,只给了一个例子,多少有点不够参考它的规律,虽然参考答案说的规律是说每个位置的行列绝对值,但是我觉得每个人思维不一样,找出的规律也可能不一样。比如我找的规律是第一行是按顺序排列,接下来每一行都是先删除末尾字母再在上一行字符串开头加上第一行的字符串的第2、3、4…个字母。于是我就只得到了70%的分
我认为一种情况是列数小于行数时开头字母会进行循环,最后看别人答案得知,其是不断增大的,所以应当让开头字母不断增加而不是循环第一行的字母。
代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int arr[]=new int[2];
for(int i=0;i<2;i++) {
arr[i]=sc.nextInt();
}//输入行列数
if(arr[0]>0&&arr[1]>0) {//行列数均大于0的情况
String brr[]=new String[arr[0]];
StringBuilder sb=new StringBuilder();
for(int j=0;j<arr[1];j++) {
int num=j+65;
sb.append((char)num);//先整出第一行
}
String a=sb.toString();
StringBuilder nb=new StringBuilder(a);
brr[0]=sb.toString();
for(int k=1;k<arr[0];k++) {
StringBuilder sbb=new StringBuilder();
sbb=sb.deleteCharAt(sb.length()-1);//删去最后一个
int ll=k+65;
char lll=(char)ll;
String ss=String.valueOf(lll);//根据k换算出要置放的字母
StringBuilder sbbb=new StringBuilder(ss);
sbbb.append(sbb);//换算得到的字母与除去末尾字母的字符串拼接
brr[k]=sbbb.toString();//放进brr结果数组
sb=sbbb;//新的字符串作为初始字符串用(即下次就是它来除末尾字母了并拿它来拼接)
}
for(int d=0;d<arr[0];d++) {//输出
System.out.println(brr[d]);
}
}
else {
System.out.println(0);
}
}
}
注意点:
得到70%结果时,我还纠结了一下是不是因为行列数为0的情况没考虑,结果考虑了是70%。但还是要注意,行列数有一个为0时输出为空并不是0。
bb两句:
确实相对于行列差绝对值的代码臃肿很多,但是就是一个思维吧,毕竟不是谁都能想到这个行列差的