[カウント]時計回り毎週プリントマトリックス

述べたように、マトリックス印刷時計回り。例えば、入力行列:

1 2 3 4    

5 6 7 8

9 10 11 12

13 14 15 16

連続して印刷:1 2 4 8,121,615,141,395,671,110

問題解決のアイデア:時計回りの印刷、この行列は1つの引き分けで始まる、円、ライン連隊として考えられ、その回線グループをロールアップされ、そうではありませんか?

ことは有名ではないアルゴリズムの転がりボールまあ!

はい、最初の印刷1234、および新しい行列に行列をロールオーバー:

8 12 16

7 11 15

9 10 14 

5 9 13

その後、第二の印刷81216、および新しい行列に行列をロールオーバー:

15 14 13

11 10 9

7 9 5

だから、友人ああ、作業を開始しました:

/**
 * @description: 顺时针打印一个矩阵
 *          例如输入矩阵:
 *              1  2  3  4
 *              5  6  7  8
 *              9  10 11 12
 *              13 14 15 16
 *          打印出:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
 * @author: JandMin
 * @create: 2019-05-24 09:26
 **/
public class ClockwisePrintMatrix {
    public static void main(String[] args) {
        int n = 6;
        int m = 7;
        int[][] matrix = getMatrix(n ,m);
        print(matrix);
        System.out.println("==========================");
        printClockwise(n,m,matrix);
    }

    /**
     * 顺时针打印
     * @param n 外层数组得长度
     * @param m 里层数组得长度
     * @param array 目标数组
     */
    private static void printClockwise(int n,int m,int[][] array){
        for(int j=0; j<m; j++){
            print(array[0][j]);
        }
        int[][] newArray = reverse(n,m,array);
        if(null == newArray || newArray.length <= 0){
            return;
        }
        printClockwise(newArray.length,newArray[0].length,newArray);
    }

    /**
     * 数组顺时针转90度,并且去掉第一个里层数组,变成一个新的数组
     * @param n 外层数组得长度
     * @param m 里层数组得长度
     * @param array 目标数组
     * @return
     */
    private static int[][] reverse(int n,int m,int[][] array) {
        if(n <=1){
            return null;
        }
        int[][] newArray = new int[m][n-1];
        int x = 0;
        int y = 0;
        for(int j=m-1; j>=0; j--){
            for(int i=1; i<n; i++){
                newArray[x][y++] = array[i][j];
            }
            x++;
            y = 0;
        }
        return newArray;
    }

    /**
     * 从1开始获取二维数组
     * @param n 外层数组得长度
     * @param m 里层数组得长度
     * @return
     */
    public static int[][] getMatrix(int n,int m){
        int[][] matrix = new int[n][m];
        int k = 1;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++) {
                matrix[i][j] = k++;
            }
        }
        return matrix;
    }

    private static void print(int[][] array){
        for(int i=0; i<array.length; i++){
            for(int j=0; j<array[i].length; j++){
                print(array[i][j]);
            }
            System.out.println();
        }
    }
    private static void print(int num){
        System.out.print(num);
        if(num < 10){
            System.out.print("  ");
        } else {
            System.out.print(" ");
        }
    }
}

次のように実行結果は以下のとおりです。

1 2 3 4 5 6 7  
8 9 10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 31 32 33 34 35 
36 37 38 39 40 41 42 
======== ==================
1 2 3 4 5 6 7 14 21 28 35 42 41 40 39 38 37 36 29 22 15 8 9 10 11 12 13 20 27 34 33 32 31 30 23 16 17 18 19 26 25 24 

もちろん、多くのソリューションは、よりシンプルになりますがあり、歓迎ダニエルはエラーを指摘し、またはコメントは、交換をより多くのソリューションを掲載しました!

問題より====== ========方法

 

おすすめ

転載: blog.csdn.net/ItRuler/article/details/90510281