如何在Java中打印矩阵的所有对角线

Rau*_*aul 3 java matrix

我试图弄清楚如何对角打印 NxN 矩阵。现在我可以打印从左到右的对角线,但不能打印从右到左的对角线。假设矩阵是:

1 2 3 
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)

现在我可以从左到右打印:

1
4 2
7 5 3 
8 6
9
Run Code Online (Sandbox Code Playgroud)

但我还想从右到左打印:

3
6 2
9 5 1
8 4
7
Run Code Online (Sandbox Code Playgroud)

这是从左到右的代码:

public static void printLeftToRightDiagonal(int[][] matrix) {
    int length = matrix.length;
    int diagonalLines = (length + length) - 1;
    int itemsInDiagonal = 0;
    int midPoint = (diagonalLines / 2) + 1;

    for (int i = 1; i <= diagonalLines; i++) {
        int rowIndex;
        int columnIndex;

        if (i <= midPoint) {
            itemsInDiagonal++;
            for (int j = 0; j < itemsInDiagonal; j++) {
                rowIndex = (i - j) - 1;
                columnIndex = j;
                System.out.print(matrix[rowIndex][columnIndex] + " ");
            }
        } else {
            itemsInDiagonal--;
            for (int j = 0; j < itemsInDiagonal; j++) {
                rowIndex = (length - 1) - j;
                columnIndex = (i - length) + j;
                System.out.print(matrix[rowIndex][columnIndex] + " ");
            }
        }
        System.out.println();
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图找出其中的模式,但我没有任何想法

dar*_*ily 5

该问题可以分为两个任务:

  1. 从通用矩阵 [i, j] 元素开始打印一个反向对角线,如果 i 和 j >= 0,则基本上在每个循环中将 i 和 j 减 1,否则结束循环。
  2. 识别起始矩阵 [i, j] 元素并打印从它们开始的反向对角线。

第一条规则相当于编写如下方法:

//example for matrix[2, 2] it will print 9 5 1
private static void printReverseDiagonal(int[][] matrix, int i, int j) {
    System.out.print(matrix[i][j]);
    for (int row = i - 1, column = j - 1; row >= 0 && column >= 0; --row, --column) {
        System.out.print(" " + matrix[row][column]);
    }
    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

第二条规则相当于编写一个循环迭代元素矩阵 [0, n - 1], 矩阵 [1, n - 1] ... 矩阵 [n - 1, n - 1] 和另一个循环迭代元素矩阵 [ n - 2, n - 1], 矩阵[n - 3, n - 1] .... 矩阵[0, n - 1] 如下所示:

public static void printRightToLeftDiagonal(int[][] matrix) {
    int n = matrix.length;

    int j = n - 1;
    for (int i = 0; i < n; ++i) {
        printReverseDiagonal(matrix, i, j);
    }
        
    int i = n - 1;
    for(j = n - 2; j >= 0; --j) {
       printReverseDiagonal(matrix, i, j);
    }           
}
Run Code Online (Sandbox Code Playgroud)

结合这两个函数,您可以获得预期的结果。