剥洋葱

 

布告,布告! 应老师要求,我们要做一道打印图形的题目,这是程序员最基本的能力。 那废话不多说,我们来说要求的图形 AAAAA ABBBA ABCBA ABBBA AAAAA 就是外到内,从A到Z。每一层都是一种字母,最里面的一层为一个,即最中心的一个。

输入格式:

一行,一个整数,即图形的层数

输出格式:

如上述图形

输入样例:

3

输出样例:

AAAAA
ABBBA
ABCBA
ABBBA
AAAAA

可以看成一个数组,可以发现这个数组是一个正方形的,最外面一层全是A,向里面一层全是B,依次下去。如果输入的是26的话,会有26层,从外向内是A——Z。
 

可以把打出来的字符矩阵看成数组的形式,如上图显示就是打印n=4时的字符矩阵,蓝色的是A,浅蓝色的是B,黄色的是C,红色的是D。可以发现,他是有规律的,从外向内一层一层的,就像剥洋葱一样。我们还可以发现,这个数组是对称的,上下对称,左右对称,所以我们只要确定出来1/4数组的内容就可以通过“折叠”来把数组整个确定下来。

如上图,这就是1/4数组,在可以可以发现,蓝色的(即A)数组坐标中较小的是0,浅蓝色的(即B)数组较小的是1,黄色的(即C)数组坐标中较小的是2,红的色(即D)数组坐标中较小的是3。由此可见,每一个字符对应了数组中不同的特征,所以可以用这个特征来确定数组每个位置对应的字符。然后向右对称,再然后让下对称。(这是数组的左上角,数组的右下角也有对应的特征,A中较大的都是6,B中较大的都是5,C中较大的都是4,D中是3。但是左下角的右上角则不一样。)

import java.util.Scanner;

public class HelloWorld {

    //这个函数是比较数组坐标那一个小的函数,返回两者之中的较小的
    static int min(int x,int y){
        if(x<y)
            return x;
        else
            return y;
    }

    public static void main(String[] args){

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        char[][] array = new char[2*n][2*n];

        char[] arr = {'\0','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'};

        //这里是先确认二维数组1/4(右上角对应的字符)
        for(int i=1;i<=n;++i){
            for(int j=1;j<=n;++j){
                int temp=min(i,j);      //调用min函数,返回坐标中较小的
                array[i][j]=arr[temp];  //较小的为1就对应A(即a[1]),较小的为二即对应B(a[2]),这里就体现出上面数组a的作用了,有了数组a,就不用if判断是几对应谁了,以前我用了26个if判断26个对应的字母
            }
        }

        for(int i=1;i<=n;++i){
            for(int j=1;j<=n;++j){     //这里是将数组向右对称,行数是从1——n,列数是从1——n,一行一行进行对称。
                array[i][2*n-j]=array[i][j];   //第一行第一列对称的第一行第2*n-1列,第一行第二列对应到第二行2*n-2列,所以行不变,列对称。
            }
        }

        for(int i=1;i<=n;++i){
            for(int j=1;j<2*n;++j)            //这里是向右对称之后的向下对称。行数从1——n,列数从1——2*n-1(因为上面已经向右对称了)
                array[2*n-i][j]=array[i][j];  //第一行第j列对应第2*n-1行第j列,即第i行第j列对应第2*n-i行第j列(i<=n)        列不变,行变。
        }

        for(int i=1;i<2*n;++i){
            for(int j=1;j<2*n;++j){
                System.out.print(array[i][j]);
            }
            System.out.println();
        }
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
  

转载于:https://www.cnblogs.com/Tomorrow-will-be-better/p/11121666.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值