算法:Z字型(Zigzag)編排


  問題:給定 n 行和 m 列的二維數組矩陣。如圖所示,以 ZIG-ZAG 方式打印此矩陣。

  從對稱的角度來看,通過反復施加滑行反射可以從簡單的圖案如線段產生規則的之字形。

  主要思想:算法從(0, 0)位置開始水平向右遍歷,當到達(0, 1)時沿着反對角線方向左下遍歷(利用一個變量控制左下右上方向),內層循環一直遍歷到碰到邊緣時row++,方向改為右上,沿着反對角線碰到矩陣上邊緣時col++,方向變為左下遍歷,知道上半部分(包括反對角線遍歷完);遍歷完半個矩陣(可能是子方矩陣)后,根據當前 row 索引和 col 索引所在位置來判斷延伸方向,若碰到邊緣,則對應行列索引數加一,沒碰到邊緣,則按內層循環的思路延伸,然后相同的思路遍歷完矩陣剩下部分。

  算法的時間復雜度為 O(n*m),其中 n, m 為輸入矩陣的行數和列數,空間復雜度為 O(1)。

  1 package algorithm;
  2 
  3 public class ZArrangement {
  4     
  5       
6
7 /** 8 * Z字型編排打印矩陣 9 * 10 * @param arr 矩陣 11 * @param n 指定子矩陣的行 12 * @param m 指定子矩陣的列 13 */ 14 private static void zigzagMatrix(int[][] arr, int n, int m) { 15 int row = 0, col = 0; 16 17 /* 行增長變量,控制↙和↗的布爾型變量*/ 18 boolean row_inc = false; 19 20 // 打印上半(包括反對角線)Z字形圖案的矩陣 21 int mn = Math.min(m, n); 22 for (int len = 1; len <= mn; ++len) { 23 for (int i = 0; i < len; ++i) { 24 System.out.print(arr[row][col] + " "); 25 26 if (i + 1 == len) { 27 break; 28 } 29 30 // 如果row_increment值為true,增加行並減少列, 否則遞減行並遞增列 31 if (row_inc) { 32 // 33 ++row; 34 --col; 35 } else { 36 // 37 --row; 38 ++col; 39 } 40 } 41 42 if (len == mn) { 43 break; 44 } 45 46 // 根據最后的增量更新行或列的值 47 if (row_inc) { 48 ++row; 49 row_inc = false; 50 } else { 51 ++col; 52 row_inc = true; 53 } 54 } 55 56 57 // 更新row和col變量的索引 58 if (row == 0) { 59 if (col == m-1) 60 ++row; 61 else 62 ++col; 63 row_inc = true; 64 } else { 65 if (row == n-1) 66 ++col; 67 else 68 ++row; 69 row_inc = false; 70 } 71 72 // 打印剩下的Z字型圖案矩陣 73 int MAX = Math.max(m, n) - 1; 74 for (int len, diag = MAX; diag > 0; --diag) { 75 if (diag > mn) 76 len = mn; 77 else 78 len = diag; 79 80 for (int i = 0; i < len; ++i) { 81 System.out.print(arr[row][col] + " "); 82 83 if (i + 1 == len) 84 break; 85 86 // 根據最后的增量更新行或列的值 87 if (row_inc) { 88 ++row; 89 --col; 90 } else { 91 ++col; 92 --row; 93 } 94 } 95 96 // 更新row和col變量的索引 97 if (row == 0 || col == m-1) { 98 if (col == m-1) 99 ++row; 100 else 101 ++col; 102 row_inc = true; 103 } 104 105 else if (col == 0 || row == n-1) { 106 if (row == n-1) 107 ++col; 108 else 109 ++row; 110 row_inc = false; 111 } 112 } 113 } 114 115 public static void main(String[] args) { 116 int[][] matrix = { 117 {1, 2, 3}, 118 {4, 5, 6}, 119 {7, 8, 9} 120 }; 121 zigzagMatrix(matrix, 3, 3); 122 } 123 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM