順時針打印矩陣

題目:輸入一個矩陣,按照從外向裏以順時針一次打印出每個數字。例如 輸入: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;
}
相關文章
相關標籤/搜索