//题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.
// 例如矩阵: 1 2 3 4
// 5 6 7 8
// 9 10 11 12
// 13 14 15 16
//则顺次打印:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
思路:我们可以定义四个方向顺次打印,然后做好边界检测功能
我们的边界条件是什么呢?打印一圈我们会发现我们要打印的矩阵的长宽各减小了2。因此,我们可以知道循环继续的条件是columns>startX*2并且rows>startY*2.
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 PrintMatrixInCircle(int** numbers, int columns, int rows, int start)
{
//既然需要打印,我们需要知道打印的起点和终点
//起点我们知道,每打印一圈的时候,都是从numbers[start][start]开始打印的
//那对于终点来讲,我们需要知道,有两个变,所以就有两个结束条件
//我们定义两个变量:endX, endY来标记我们的终点
int endX = rows-1 - start;
int endY = columns-1 - start;
//从左到右打印一行
for (int i = start; i <= endY; ++i)
{
printNumber(number[start][i]);
}
//从上到下打印一列
//***需要注意的是:最后一圈可能退化成一行、一列、甚至只有一个数字,所以打印这样一圈就不需要四行了
if (start < endY)
{
for (int i = start; i <= endY; ++i)
{
printNumber(number[start][i]);
}
}
//下边
if (start < endX&&start < endY)
{
for (int i = start; i < endY; ++i)//有没有等于号呢
{
printNumber(number[start][i]);
}
}
//左边
if (start < endX&&start < endY - 1)
{
for (int i = start; i < endY; ++i)//有没有等于号呢
{
printNumber(number[start][i]);
}
}
}