Question
How would you traverse an array diagonally and display its contents ?
Say you have something like this,
1 2 3
4 5 6
7 8 9In the above array, if you traverse from top left corner, then the list of number will be,
[1], [2,4], [3,5,7], [6,8], [9]How would you get the above set?SolutionReference: http://stackoverflow.com/questions/1779199/traverse-matrix-in-diagonal-strips 0 1 20 1 2 31 4 5 62 7 8 9The list of indices for the required traversals are,{[0,0]} {[0,1][1,0]} {[0,2][1,1][2,0]} {[1,2][2,1]} {[2,2]}If you can get the pattern, then you can do this easily. Total 5 slices will come which is array size N * 2-1. i.e, for 3x3 = 6-1 = 5.you should have a incrementing counter at row/column when moving to the middle slice. After that you need a decrementing counter at row/column.Code
void main(){ int x[3][3] = {1, 2, 3,4, 5, 6,
7, 8, 9};
int N=3;for (int slice = 0; slice < N*2-1; ++slice) {
int z = slice < N ? 0 : slice - N + 1;for (int j = z; j <= slice - z; ++j) {
int c1=j; int c2=(N-1)-(slice-j); printf("%d ", x[c1][c2]);}
printf("\n");}
printf("\n");for (int slice = 0; slice < N*2-1; ++slice) {
int z = slice < N ? 0 : slice - N + 1;for (int j = z; j <= slice - z; ++j) {
int c1=j; int c2=slice-j; printf("%d ", x[c1][c2]);}
printf("\n");}
}
here slice maintains the incrementing/decrementing index required. slice-N+1 will take care of that valueslice-j allows as move in both row and column.When you need to move from top right, just subtract N-1 from slice-j so that you also travel from top right.
Output
Top right to bottom left
3
2 6
1 5 9
4 8
7
Top left to bottom right
1
2 4
3 5 7
6 8
9
No comments:
Post a Comment