輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字。
解題思路:我們把打印一圈分爲四步:第一步從左到右打印一行,第二步從上到下打印一列,第三步從右到左打印一行,第四步從下到上打印一列。值得注意的是,最後一圈有可能退化成只有一行、只有一列,甚至只有一個數字。
因此要仔細分析打印時每一步的前提條件。第一步總是需要的,因爲打印一圈至少有一步。如果只有一行,就不用第二步了。也就是需要第二步的前提條件是終止行號大於起始行號。需要第三部打印的前提條件是圈內至少有兩行兩列,也就是說除了要求終止行號大於起始行號之外,還要求終止列號大於起始列號。需要打印第四步的前提條件是至少有三行兩列,因此要求終止行號比起始行號至少大2,終止列號大於起始列號。
C#實現:
#region 順時針打印矩陣 /// 輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字。 /// public static void PrintMatrixClockwisely(int[,] numbers, int columns, int rows) { if (numbers == null || columns <= 0 || rows <= 0) return; int start = 0; while (columns > start * 2 && rows > start * 2) { PrintMatrixInCircle(numbers, columns, rows, start); start++; } } private static void PrintMatrixInCircle(int[,] numbers, int columns, int rows, int start) { int endX = columns - 1 - start; int endY = rows - 1 - start; // 從左到右打印一行 for (int i = start; i <= endX; i++) Console.Write(numbers[start, i] + ","); // 從上到下打印一列 if (start < endY) for (int i = start + 1; i <= endY; i++) Console.Write(numbers[i, endX] + ","); // 從右到左打印一行 if (start < endX && start < endY) for (int i = endX - 1; i >= start; i--) Console.Write(numbers[endY, i] + ","); // 從下到上打印一行 if (start < endX && start < endY - 1) for (int i = endY - 1; i >= start + 1; i--) Console.Write(numbers[i, start] + ","); } #endregion
Java實現:
/** 順時針打印矩陣 * 輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字。 */ public static void printMatrixClockwisely(int[][] numbers, int columns, int rows){ if(numbers == null || columns <= 0 || rows <= 0) return; int start = 0; while(columns > start * 2 && rows > start *2){ printMatrixInCircle(numbers, columns, rows, start); start++; } } private static void printMatrixInCircle(int[][] numbers, int columns, int rows, int start) { int endX = columns - 1 - start; int endY = rows - 1 - start; // 從左到右打印一行 for (int i = start; i <= endX; i++) System.out.print(numbers[start][i] + ","); // 從上到下打印一列 if (start < endY) for (int i = start + 1; i <= endY; i++) System.out.print(numbers[i][endX] + ","); // 從右到左打印一行 if (start < endX && start < endY) for (int i = endX - 1; i >= start; i--) System.out.print(numbers[endY][i] + ","); // 從下到上打印一行 if (start < endX && start < endY - 1) for (int i = endY - 1; i >= start + 1; i--) System.out.print(numbers[i][start] + ","); }
Python實現:
def printMatrixClockWisely(numbers, columns, rows): """ 順時針打印矩陣 輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字。 :param numbers: :param columns: :param rows: :return: """ if numbers == None or columns <= 0 or rows <=0: return start = 0 while columns > start * 2 and rows > start *2: printMatrixInCircle(numbers, columns, rows, start) start +=1 def printMatrixInCircle(numbers, columns, rows, start): endX = columns - 1 - start endY = rows - 1 - start # 從左到右打印一行 for i in range(start, endX+1): print(numbers[start][i], end=', ') # 從上到下打印一列 if start < endY: for i in range(start+1, endY+1): print(numbers[i][endX], end=', ') # 從右到左打印一行 if start < endX and start < endY: for i in range(endX - 1, start-1, -1): print(numbers[endY][i], end=', ') # 從下到上打印一行 if start < endX and start < endY - 1: for i in range(endY-1, start, -1): print(numbers[i][start], end=', ')