Search code examples
matrixtraversal

Traverse Rectangular Matrix in Diagonal strips


I need the same thing done here, but to work with any matrix, not just a square one. Also, the direction of traversal needs to be opposite. I tried to edit the code I found there, but couldn't figure it out.

Thanks.


Solution

  • I remember writing that. I think for a rectangular matrix you'd need a few minor changes and one more line of incomprehensible nonsense:

    #include <stdio.h>
    
    int main()
    {
        int x[3][4] = { 1,  2,  3,  4,
                        5,  6,  7,  8,
                        9, 10, 11, 12};
        int m = 3;
        int n = 4;
        for (int slice = 0; slice < m + n - 1; ++slice) {
            printf("Slice %d: ", slice);
            int z1 = slice < n ? 0 : slice - n + 1;
            int z2 = slice < m ? 0 : slice - m + 1;
            for (int j = slice - z2; j >= z1; --j) {
                    printf("%d ", x[j][slice - j]);
            }
            printf("\n");
        }
        return 0;
    }
    

    Output:

    Slice 0: 1
    Slice 1: 5 2
    Slice 2: 9 6 3
    Slice 3: 10 7 4
    Slice 4: 11 8
    Slice 5: 12
    

    To briefly explain how it works, each slice is a diagonal starting from the first column, going diagonally up-right and ending on the first row (originally down-left, but now swapped as a result of a comment from the poster).

    z2 says how many items must be skipped before the first number should be printed. This is zero for the first m slices and then increases by one for each remaining slice. z1 is how many items should be skipped at the end, again starting at zero for the first m slices, and increasing by one for the remaining slices.