views:

136

answers:

1

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.

+1  A: 

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.

Mark Byers
Yes, that's what I wanted. But...What I actually need is Traverse Rectangular Matrix in ANTI-Diagonal strips. :) I tried swapping the indices in the answer you gave for the square matrix, and I thought I could apply the same principle here - just to swap the indices, and to get anti-diagonal traversal. However, for rectangular matrix it won't work. So, should do I now ask one more question for ANTI-diagonal rectangular traversal??? Thanks for the answer :)
misaizdaleka
I'm not entirely sure what you mean by anti-diagonal. Updating your question would help. I think what you need to do is flip the y-coordinates when you read the array values but leave x unchanged, i.e. `x[m - j - 1][slice - j]` instead of `x[j][slice - j]`. This gives [9],[10,5],[11,6,1], etc... Is that what you want?
Mark Byers
Sorry, my mistake again... I was not precise. No, I need the same traversal, but not going like [1], [2,5], [3,6,9], but like [1], [5,2], [9,6,3], etc. Thanks again.
misaizdaleka
OK, that's easy: just reverse the order of the iteration in the for loop. I've updated my answer. I think it does what you want now.
Mark Byers
Yes, that's exactly what I need, thank you very much!So, do I know update my question, or just leave it like this?
misaizdaleka
Up to you.... the site is most useful to others if the answers make sense in relation to the questions. But I guess not many people will find this thread, so maybe it's not worth the effort... :) Anyway welcome to SO.
Mark Byers