11

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.

Community
  • 1
  • 1
misaizdaleka
  • 1,776
  • 3
  • 21
  • 32

1 Answers1

23

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
  • 811,555
  • 193
  • 1,581
  • 1,452
  • 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 Jan 21 '10 at 21:38
  • 1
    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 Jan 21 '10 at 21:43
  • 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 Jan 21 '10 at 21:46
  • 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 Jan 21 '10 at 21:51
  • 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 Jan 21 '10 at 21:57
  • 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 Jan 21 '10 at 22:03
  • Thank You so much. You just saved me from writing 6 nested for loops. :) I needed both the patterns. Yes it was a bit difficult to find the thread, but it was worth the effort. – Darshan Pandit May 13 '13 at 07:25
  • 1
    and just to complete this answer how would you traverse the inverse diagonals? – elios264 Jul 25 '14 at 03:30