題目:輸入一個矩陣。按照從外向裏以順時針的順序依次打印出每個數字。例如輸入以下矩陣:
1 2 3 4ios
5 6 7 8
9 10 11 12數組
13 14 15 16測試
打印出的數字爲:一、二、三、四、八、十二、1六、1五、1四、1三、九、五、六、七、十一、10spa
思路:先判斷循環條件,由圖能夠發現當行數和列數都 > 循環起始點(左上角)* 2時,循環開始。
能夠循環以後,就要打印一圈,打印一圈有以下幾種狀況:
1.向左打印,這個是必須的。
2.從上向下打印,此時終止行號要大於起始行號。
3.從右向左打印,除了終止行號要大於起始行號外,還需終止列號要大於起始列號,也就是至少兩行兩列。
4.從下往上打印,至少須要三行兩列,也就是終止行號要比起始行號大2,終止列號要大於起始列號code
測試實例:數組中有多行多列、只有一行或者一列、只有一行一列。io
#include<iostream> using namespace std; 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++) { int number = numbers[start][i]; cout << number << " "; } //從上到下打印一列 if (start < endY) { for (int i = start + 1; i <= endY; i++) { int number = numbers[i][endX]; cout << number << " "; } } //從右到左打印一行 if (start < endX && start < endY) { for (int i = endX - 1; i >= start; i--) { int number = numbers[endY][i]; cout << number << " "; } } //從下到上打印一列 if (start < endX && start < endY - 1) { for (int i = endY - 1; i >= start + 1; i--) { int number = numbers[i][start]; cout << number << " "; } } } 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; } } void test1() { int a[2][2] = {1, 2, 3, 4}; PrintMatrixClockwisely((int**)a, 2, 2); /**for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { cout << a[i][j] << " "; } }**/ } int main() { test1(); return 0; }