打印一个 N*N 的方阵,N为每边                  N=15  打印出下面图形
 字符的个数(3<N<20), 要求最              TTTTTTTTTTTTTTT
 外一层为"T", 第二层为"J", 从第三层             TJJJJJJJJJJJJJT
 起每层依次打印数字 1,2,3,...                 TJ11111111111JT
 (右图以N为15为例)                           TJ12222222221JT
                                            TJ12333333321JT
                                            TJ12344444321JT
                                            TJ12345554321JT
                                            TJ12345654321JT
                                            TJ12345554321JT
                                            TJ12344444321JT
                                            TJ12333333321JT
                                            TJ12222222221JT
                                            TJ11111111111JT
                                            TJJJJJJJJJJJJJT
                                            TTTTTTTTTTTTTTT

解决方案 »

  1.   

    N=15  打印出下面图形 TTTTTTTTTTTTTTT 
    TJJJJJJJJJJJJJT 
    TJ11111111111JT 
    TJ12222222221JT 
    TJ12333333321JT 
    TJ12344444321JT 
    TJ12345554321JT 
    TJ12345654321JT 
    TJ12345554321JT 
    TJ12344444321JT 
    TJ12333333321JT 
    TJ12222222221JT 
    TJ11111111111JT 
    TJJJJJJJJJJJJJT 
    TTTTTTTTTTTTTTT
    帮排版
      

  2.   

    /**
     * 算法说明:
     * 分析该矩阵需求,有一个特点,除去最外层两圈,
     * 中间所打印的数字的规律,可以认为是该数字所在位置距离四个边的距离中最短的,
     * 再仔细分析,如果将J和T也算作数字,也能符合这个规律(假定J是0,T是-1)。
     * 
     * 所以,问题简化为,算出某一个位置据四边的最短距离,然后取“TJ123456789”这个字符串中响应位置的字符打印即可。
     * 
     * 
     * @author jinxfei
     *
     */
    public class Test {
    private static String allChars="TJ123456789";
    public static void main(String[] args){

    int order=20;//矩阵的大小

    for(int i=0; i<=order;i++){
    for (int j=0; j<=order;j ++){
    System.out.print(getChar(j,i,order));
    }
    System.out.println();
    }

    }

    //计算当前坐标应该打印的字符
    private static char getChar(int y,int x, int order){
    //首先算出当前坐标据四个边的位置
    int toLeft=y;
    int toTop=x;
    int toRight=order-y;
    int toBottom=order-x;
    //取其中的最小值
    return allChars.charAt(getMin(toLeft,toTop,toRight,toBottom));
    }

    //计算取四个数中最小的值
    private static int getMin(int a1, int a2, int a3, int a4){
    int min=getMin(a1,a2);
    min=getMin(min,a3);
    min=getMin(min,a4);
    return min;
    }
    //取两个数字中的最小值。
    private static int getMin(int a1, int a2){
    int min=a1;
    if (min>a2){
    min=a2;
    }
    return min;
    }
    }