Cho một ma trận [hàng] [col], chúng ta phải in ma trận đã cho theo kiểu zig-zag như trong hình bên dưới -
Vì vậy, đầu ra sẽ giống như -
Output: 10 20 40 70 50 30 60 80 90
Đối với vấn đề trên, chúng tôi đã làm theo một cách tiếp cận đơn giản, trong đó chúng tôi phải lặp lại ma trận theo đường chéo và thay đổi giá trị của phép lặp để thay đổi hướng sau mỗi trận đấu trước đó.
Thuật toán
START STEP 1-> DECALRE AND SET k = 3, l = 3 STEP 2-> DECLARE A MATRIX mat[][3] STEP 3-> DECLARE AND SET row = 0, col = 0, flag = false; STEP 4-> SET mn = MINIMUM(k, l) STEP 5-> LOOP FOR len = 1 AND len <= mn AND ++len LOOP FOR i = 0 AND i < len AND ++i PRINT mat[row][col] IF i + 1 == len THEN, BREAK END IF IF flag THEN, INCREMENT row BY 1 AND DECREMENT col BY 1 ELSE DECREMENT row BY 1 AND INCREMENT col BY 1 END IF END FOR IF len == mn THEN, BREAK END IF IF flag THEN INCREMENT row BY 1 AND SET flag = FALSE ELSE INCREMENT col BY 1 AND SET flag = TRUE END IF END FOR STEP 6-> IF row == 0 THEN, IF col == k – 1 THEN, INCREMENT row BY 1 ELSE INCREMENT col BY 1 END IF SET flag = 1 ELSE IF row == l – 1 THEN, INCREMENT col BY 1 ELSE INCREMENT row BY 1 SET flag = 0 END IF STEP 7-> SET MAX = MAXIMUM(k, l) – 1 STEP 8-> LOOP FOR len, diag = MAX AND diag > 0 AND --diag IF diag > mn THEN, SET len = mn ELSE SET len = diag END IF FOR i = 0 AND i < len AND ++i PRINT mat[row][col] IF i + 1 == len THEN, BREAK END IF IF flag THEN, INCREMENT row BY 1 AND DECREMENT col BY 1 ELSE INCREMENT col BY 1 AND DECREMENT row BY 1 END IF IF row == 0 || col == k – 1 THEN, IF col == k - 1 INCREMENT row BY 1 ELSE INCREMENT col BY 1 END IF SET flag = true ELSE IF col == 0 || row == l – 1 THEN, IF row == l – 1 THEN, INCREMENT col BY 1 ELSE INCREMENT row BY 1 END IF SET flag = false ENF IF END FOR STOP
Ví dụ
#include <stdio.h> #include <stdbool.h> #define C 3 #define min(a, b) a>b?b:a #define max(a, b) a>b?a:b int main(){ int k = 3, l = 3; int mat[][3] = { { 10, 20, 30 }, { 40, 50, 60 }, { 70, 80, 90 } }; int row = 0, col = 0; bool flag = false; int i, j, len, diag; int MAX; int mn = min(k, l); //to check the minimum number and return that minimum number for ( len = 1; len <= mn; ++len) { for ( i = 0; i < len; ++i) { printf("%d ", mat[row][col]); //Printing the matrix in zigzag format if (i + 1 == len) break; if (flag) ++row, --col; else --row, ++col; } if (len == mn) break; if (flag) ++row, flag = false; else ++col, flag = true; } if (row == 0) { if (col == k - 1) ++row; else ++col; flag = 1; } else { if (row == l - 1) ++col; else ++row; flag = 0; } MAX = max(k, l) - 1; //To check the maximum element for ( len, diag = MAX; diag > 0; --diag) { //Loop to go diagonally. if (diag > mn) len = mn; else len = diag; for ( i = 0; i < len; ++i) { printf("%d ", mat[row][col]); if (i + 1 == len) break; if (flag) ++row, --col; else ++col, --row; } if (row == 0 || col == k - 1) { if (col == k - 1) ++row; else ++col; flag = true; } else if (col == 0 || row == l - 1) { if (row == l - 1) ++col; else ++row; flag = false; } } return 0; }
Đầu ra
Chương trình này sẽ in đầu ra -
10 20 40 70 50 30 60 80 90