题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
思路:把矩阵看成由若干个顺时针方向的圆组成,用一个循环来打印矩阵,每次打印矩阵中的一个圆。循环继续的条件为columns > startX * 2 并且 rows > startY * 2(令每一圈的左上角为(startY,startX))。接着把打印一圈分为四步:第一步,从左到右打印一行;第二步,从上到下打印一列;第三步,从右到左打印一行;第四步,从下到上打印一列。每一步根据起始坐标(start,start)和终止坐标(endY,endX)用一个循环就能打印出一行或一列。需要注意,打印最后一圈的时候,可能只需要三步、两步或一步。
打印每一步时的前提条件为:
步数 | 前提条件 |
---|---|
第一步 | 无前提,因为打印一圈至少有一步 |
第二步 | 终止行号大于起始行号,即 start < endY |
第三步 | 终止行号大于起始行号且终止列号大于起始列号,即 start < endY && start < endX |
第四步 | 终止行号比起始行号至少大2且终止列号大于起始列号,即 start < endY - 1 && start < endX |
核心代码如下:
void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);
void PrintMatrixClockwisely(int** numbers, int columns, int rows){
if(numbers == nullptr || columns <= 0 || rows <= 0)
return;
int start = 0;
while(columns > start * 2 && rows > start * 2){ //判断是否还有圆圈需要继续打印
PrintMatrixInCircle(numbers, columns, rows, start);
start++;
}
}
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 < endY && start < endX){
for(int i = endX - 1; i >= start; i--){
int number = numbers[endY][i];
cout << number << " ";
}
}
//从下到上打印一列
if(start < endY - 1 && start < endX){
for(int i = endY - 1; i >= start + 1; i--){
int number = numbers[i][start];
cout << number << " ";
}
}
}