題目:輸入一個矩陣,按照從外向裏以順時針一次打印出每個數字。例如 輸入:ios
1 2 3 4spa
5 6 7 8code
9 10 11 12對象
13 14 15 16 則打印的順序爲:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16io
當遇到一個複雜問題的時候,能夠使用圖形來幫助咱們思考,因爲是以從外圈到內圈的順序依次打印,咱們能夠把矩陣想象成若干的圈,以下圖所示。能夠使用一個循環來打印矩陣,每一次打印矩陣中的一個圈。class
把矩陣當作是由若干個順時針的圈組成。接下來分析循環的結束條件。假設矩陣的行數是 rows,列數是 columns。打印第一圈的左上角的座標是(0,0),第二圈的左上角的座標是(1, 1),以此類推。左上角的座標中行標和列標都是相同的,能夠在矩陣中選取左上角的元素做爲分析的對象。能夠得出,循環繼續的條件是 columns > startX * 2 而且 rows > startY * 2. 能夠使用以下循環來打印矩陣;stream
void PrintMatrixClockwisely(int numbers[][MaxSize], int columns, int rows)
{
if(numbers == NULL || columns == 0 || rows == 0)
return;
int start = 0;
while(columns > 2 * start && rows > 2 * start)
{
PrintMatrixInCircle(numbers, columns, rows, start);
++start;
}
}循環
接下來考慮打印一圈的功能,能夠將打印一圈分爲四步:1)從左到右打印一行 2)從上到下打印一列 3)從右到左打印一行 4)從下到上打印一列。im
不過值得注意的是,最後一圈可能退化成只有一行,只有一列,甚至只有一個數字,所以打印這樣的一圈就再也不須要四步。以下圖:img
所以,打印時每一步的前提條件:第一步老是須要的,由於打印一圈至少有一步。若是隻有一行,那麼就不用第二步了。也就是須要第二步的前提條件是終止行號大於起始行號。須要第三步打印的前提條件是圈內至少有兩行兩列,也就是說除了要求終止行號大於起始行號以外,還要求終止列號大於起始列號。同理,須要打印的第四步的前提條件是至少有三行兩列,所以,要求終止行號比起始行號至少大2,同時,終止列號大於起始列號。
void PrintMatrixInCircle(int numbers[][MaxSize], int columns, int rows, int start)
{
int endX = columns - start - 1;
int endY = rows - start -1;
//從左往右打印上面一行
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 << " ";
}
}
}
//順時針打印矩陣 #include<iostream> using namespace std; const int MaxSize = 4; //打印矩陣裏的一圈 void PrintMatrixInCircle(int numbers[][MaxSize], int columns, int rows, int start) { int endX = columns - start - 1; int endY = rows - start -1; //從左往右打印上面一行 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[][MaxSize], int columns, int rows) { if(numbers == NULL || columns == 0 || rows == 0) return; int start = 0; while(columns > 2 * start && rows > 2 * start) { PrintMatrixInCircle(numbers, columns, rows, start); ++start; } } int main() { int num[5][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}, {13, 14, 15, 16},{17, 18, 19, 20}}; PrintMatrixClockwisely(num, 4, 5); system("pause"); return 0; }