蓝桥杯:字母图形

381 阅读2分钟

解析:

规律:每增加一行,该行字母就会向右移动一位,同时左边补充一个字母。

关键点规律:每行的输出都是以A为起点,分别向A的左右两边按字母表的顺序依次输出。每行的起始字母在字母表中的顺序与当前行数相等,比如第一行A开头,第二行B开头。

存在三种特殊情况:A处于最左边,A处于最右边,A不在显示范围。不管是哪种情况,这种规律都适用。A处于最左边时只向A的右边输出,A处于最右边时只向A的最左边输出,A不在显示范围时还是只向A的最左边输出。

易错点: 这里有个地方容易忽视,因为题目只给了一个例子,这个例子是m>n的,这种情况是很容易实现的,所以就会忽视m<n的这种情况,比如当n=5,m=2时。

上代码:

package _3_5_test;

import java.util.Scanner;

public class FourtyThree {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String letter[] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
				"S", "T", "U", "V", "W", "X", "Y", "Z" };

		Scanner scanner = new Scanner(System.in);

		int n = scanner.nextInt();
		int m = scanner.nextInt();

		int flagNum = 0;

		// 输出图形
		// 行
		for (int i = 0; i < n; i++) {
			boolean flag = false;
			flagNum = i;
			// 列
			for (int j = 0; j < m; j++) {
				// 每行第一个输出的字母在字母表中的顺序正好与当前行数相等
				System.out.print(letter[flagNum]);
				// 如果当前字母是A开头或者A居中间并且已经输出,则将判断条件改成true
				if (flagNum == 0) {
					flag = true;
				}
				// 如果是true,flagNum递增,字母向A的右边输出;如果是false,flagNum递减,字母向A的左边输出;
				if (flag) {
					flagNum++;
				} else {
					flagNum--;
				}
			}
			System.out.println();
		}

	}

}