蓝桥杯-输出米字型

package exec;

import java.util.Scanner;

/**
  根据输入的正整数n (1  米字形由一个(2n-1)*(2n-1)的矩阵组成,矩阵包含从大写A开始的n个字母
  例如:n=3时,包含A,B,C;n=4时,包含A,B,C,D。
  矩阵的正中间为n个字母中字典序最大的那个,从这个字母开始,沿着西北、正北、东北、正西、正东、西南、正南、东南八个方向各有一条由大写字母组成的直线。并且直线上的字母按字典序依次减小,直到大写字母A。
  矩阵的其它位置用英文句号.填充。

  样例输入一
  3

  样例输出一
  A.A.A
  .BBB.
  ABCBA
  .BBB.
  A.A.A

  样例输入二
  4

  样例输出二
  A..A..A
  .B.B.B.
  ..CCC..
  ABCDCBA
  ..CCC..
  .B.B.B.
  A..A..A
 * @author Vivinia
 *
 * 2018年2月3日
 */
public class FuShu {

	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		input.close();
		int l=2*n-1;             //数组的行列数
		char[][] mi=new char[l][l];
		for(int i=0;i<l;i++) {
			for(int j=0;j<l;j++) {
				if(i==j) {     //正对角线\
					if(i<=n-1)
						mi[i][j]=(char) ('A'+i);
					else
						mi[i][j]=mi[i-2*(i-(n-1))][i-2*(i-(n-1))];     //下半部分等于上半部分
				}
				else if(i==l-1-j) {   //副对角线/
					if(i>j)
						mi[i][j]=mi[j][j];   //下半部分
					else
						mi[i][j]=mi[i][i];   //上半部分
				}
				else if(i==n-1) {      //中间横向
					if(j<=n-1)
						mi[i][j]=(char) ('A'+j);
					else
						mi[i][j]=mi[j-2*(j-(n-1))][j-2*(j-(n-1))];     //右半部分等于左半部分
				}
				else if(j==n-1) {      //中间纵向
					if(i<=n-1)
						mi[i][j]=(char) ('A'+i);
					else
						mi[i][j]=mi[i-2*(i-(n-1))][i-2*(i-(n-1))];     //下半部分等于上半部分
				}
				else
					mi[i][j]='.';     //其余地方用.填充
			}
		}
		for(int i=0;i<l;i++) {
			for(int j=0;j<l;j++)
				System.out.print(mi[i][j]);
			System.out.println();
		}
	}

}

逻辑稍微有点复杂的是对应关系,不管横向纵向还是斜着,前半部分递增的是比较好输出的,后半部分递减需要找到和坐标位置的变化规律。

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/hester_hester/article/details/79245446
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞