题目描述
输入一个矩阵,按照从外到内以顺时针依次打印每一个数字。例如输入如下矩阵:
1 2 3 4 5
6 7 8 9 10
1 2 3 4 5
6 7 8 9 10
则依次打印:1、2、3、4、5、10、5、10、9、8、7、6、1、6、7、8、9、4、3、2
实现
算法描述
利用循环实现,每次循环打印矩阵中的一个圈,循环的条件为:columns>startX*2 && rows>startY*2
,这个条件画图分析可以很容易的得到。打印一圈可以分四步走:从左至右、从上至下、从右至左、从下至上。每一步根据起始坐标和终止坐标利用循环即可打印出一行或者一列。这里需要考虑的边界条件是,最后一圈可能发生退化(画图可以很自然地得到):
- 如对于一个5*5矩阵,最后一圈打印就退化成一个数字
- 如对于一个5*3矩阵,最后一圈打印就退化成一列
- 如对于一个3*4矩阵,最后一圈打印就退化成一行
有了这几个前提,考虑每一圈的打印:
- 首先第一步是必需的,因为打印一圈至少需要一步;
- 如果只有一行,那么就不需要第二步,即第二步的前提条件为
终止行号>起始行号
- 第三步的前提条件是圈内至少有两行两列,即
终止行号>起始行号 && 终止列号>起始列号
- 第四步的前提条件是至少三行两列,即
终止行号>=起始行号+2 && 终止列号>起始列号
代码
算法实现及测试代码:
#include <cstdlib>
#include <iostream>
using namespace std;
//打印一个数字
void printNumber(int number)
{
cout << number << " ";
}
//按圈打印
void PrintMatrixInCircle(int** matrix, int columns, int rows, int start)
{
int endX = columns - start - 1;
int endY = rows - start - 1;
//step1:从左到右
for (int i = start; i <= endX; i++)
{
printNumber(matrix[start][i]);
}
//step2:从上到下
if (start<endY)
{
for (int i = start + 1; i <= endY; i++)
{
printNumber(matrix[i][endX]);
}
}
//step3:从右到左
if (start<endX&&start<endY)
{
for (int i = endX - 1; i >= start; i--)
{
printNumber(matrix[endY][i]);
}
}
//step4:从下到上
if (start<endX&&start<endY - 1)
{
for (int i = endY - 1; i >= start + 1; i--)
{
printNumber(matrix[i][start]);
}
}
}
//顺时针打印循环函数
void PrintMatrixClockwisely(int** matrix, int columns, int rows)
{
if (matrix == NULL || columns <= 0 || rows <= 0)
{
return;
}
int start = 0;
while (columns>start * 2 && rows>start * 2)
{
PrintMatrixInCircle(matrix, columns, rows, start);
start++;
}
}
//测试主函数
int main()
{
//初始化
int **matrix = new int*[4];
for (int i = 0; i < 4; i++)
{
matrix[i] = new int[5];
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 5; j++)
{
matrix[i][j] = rand();
}
}
//打印原始矩阵
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 5; j++)
{
printNumber(matrix[i][j]);
}
}
cout << endl << endl;
//顺时针打印
PrintMatrixClockwisely(matrix, 5, 4);
//释放内存
for (int i = 0; i < 4; i++)
{
delete[] matrix[i];
}
delete[] matrix;
return 0;
}
测试结果
其他测试用例
数组有多行多列,数组仅一行,数组仅一列,数组仅一行一列。