Loop diagonally through two dimensional array

前端 未结 12 1337
刺人心
刺人心 2020-12-05 11:52

I wrote the following code to walk half the diagonals of an array:

String[][] b = [a,b,c]
               [d,e,f]
               [g,h,i];  

public void LoopD         


        
12条回答
  •  庸人自扰
    2020-12-05 11:55

    Initialize array only for test purpose:

        int dim = 5;
        char ch = 'A';
        String[][] array = new String[dim][];
        for( int i = 0 ; i < dim ; i++ ) {
            array[i] = new String[dim];
            for( int j = 0 ; j < dim ; j++, ch++ ) {
                array[i][j] = "" + ch;
            }
        }
    

    Output our matrix:

        for( int i = 0 ; i < dim ; i++ ) {
            for( int j = 0 ; j < dim ; j++, ch++ ) {
                System.out.print( array[i][j] + " " );
            }
            System.out.println();
        }
        System.out.println( "============================" );
    

    Solution

    Element indexes from diagonals have one rule - their sum is constant on one diagonal:

    VARIANT 1

    Use two loops to extract all diagonals.

    First loop extracts top half of diagonals:

        for( int k = 0 ; k < dim ; k++ ) {
            for( int j = 0 ; j <= k ; j++ ) {
                int i = k - j;
                System.out.print( array[i][j] + " " );
            }
            System.out.println();
        }
    

    Second loop iterates on bottom half of diagonals:

        for( int k = dim - 2 ; k >= 0 ; k-- ) {
            for( int j = 0 ; j <= k ; j++ ) {
                int i = k - j;
                System.out.print( array[dim - j - 1][dim - i - 1] + " " );
            }
            System.out.println();
        }
    

    VARIANT 2

    Use one loop to extract all diagonals, but there are extra iterations and one additional check:

        for( int k = 0 ; k < dim * 2 ; k++ ) {
            for( int j = 0 ; j <= k ; j++ ) {
                int i = k - j;
                if( i < dim && j < dim ) {
                    System.out.print( array[i][j] + " " );
                }
            }
            System.out.println();
        }
    

    The output:

    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 
    ============================
    A 
    F B 
    K G C 
    P L H D 
    U Q M I E 
    V R N J 
    W S O 
    X T 
    Y 
    

    Update

    There are questions about rectangular matrix (height != width) in comments. Here is solution for rectangular matrix:

    The rule remains the same: Sum of element indexes from the same diagonal is constant

    The minimum sum of indexes is 0 (for first element in matrix with indexes [0;0])

    The maximum sum of indexes is width + height - 2 (for last element in matrix with indexes [height-1; with-1])

    Initialize rectangular matrix only for test purpose:

        int WIDTH = 7;
        int HEIGHT = 3;
        char ch = 'A';
        String[][] array = new String[HEIGHT][];
        for( int i = 0 ; i < HEIGHT ; i++ ) {
            array[i] = new String[WIDTH];
            for( int j = 0 ; j < WIDTH ; j++, ch++ ) {
                array[i][j] = "" + ch;
            }
        }
    

    Print our rectangular matrix:

        for( int i = 0 ; i < HEIGHT ; i++ ) {
            for( int j = 0 ; j < WIDTH ; j++, ch++ ) {
                System.out.print( array[i][j] + " " );
            }
            System.out.println();
        }
        System.out.println( "============================" );
    

    Solution

        for( int k = 0 ; k <= WIDTH + HEIGHT - 2; k++ ) {
            for( int j = 0 ; j <= k ; j++ ) {
                int i = k - j;
                if( i < HEIGHT && j < WIDTH ) {
                    System.out.print( array[i][j] + " " );
                }
            }
            System.out.println();
        }
    

    Output:

    A B C D E F G 
    H I J K L M N 
    O P Q R S T U 
    ============================
    A 
    H B 
    O I C 
    P J D 
    Q K E 
    R L F 
    S M G 
    T N 
    U 
    

提交回复
热议问题