题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:
如果输入以下矩阵:
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。
可以将这个矩阵看成一个一个的圆圈,每个圆圈都有一个起点,可以将左上角作为起点进行开始顺时针遍历圆圈。
左上角的坐标分别为(0,0),(1,1)
可以看出左上角的坐标的横纵坐标都是相等的,接下来看如何根据左上角的坐标来判断是否要进行顺时针遍历。
矩阵的行列要大于横纵坐标的二倍的话就可以进行遍历。
坐标为(0,0)的话,矩阵的行列最起码要是1*1
坐标为(1,1)的话,矩阵的行列最起码要是3*3
坐标为(2,2)的话,矩阵的行列最起码要是5*5
接下来就是给了起始坐标来遍历这个圆圈。
对于遍历圆圈的话,可以是先
从左到右遍历
在从上到下遍历
在从右到左遍历
最后是从下到上遍历
如图:对于便利的话,有着几种情况:
有着四种情况,分别是走一步,两步,三步,四步
对于如何来判断是遍历什么情况的圆圈。要根据条件的限制
一步:最少是一行,这个没有限制,因为可以进来遍历的话,最少都是一晃
两步:最少是两行
三步:最少要是两行两列
四步:最少要是三行两列
根据上面的分析就可以写出代码了:
//遍历圆圈
void PrintMatrixInCircle(int number[][MAX], int row, int col, int start)
{
//列的终点位置
int EndCol = col - start - 1;
//行的终点位置
int EndRow = row - start - 1;
int i = 0;
//打印从左到右
for (i = start; i <= EndCol; i++)
{
if (number[start][i])
{
printf("%d ", number[start][i]);
}
}
//打印从上到下
if (start < EndRow)
{
for (i = start + 1; i <= EndRow; i++)
{
if (number[i][EndCol])
{
printf("%d ", number[i][EndCol]);
}
}
}
//打印从右到左
if (start < EndCol && start < EndRow)
{
for (i = EndCol - 1; i >= start; i--)
{
if (number[EndRow][i])
{
printf("%d ", number[EndRow][i]);
}
}
}
//打印从下到上(至少要有三行两列)
if (start < EndCol && start < EndRow - 1)
{
for (i = EndRow - 1; i >= start + 1; i--)
{
if (number[i][start])
{
printf("%d ", number[i][start]);
}
}
}
}
//打印起点
void PrintMatrixClockwise(int number[][MAX], int row, int col)
{
if (number == NULL || row == 0 || col == 0)
{
return;
}
//起点的横纵坐标每次都是一样的。如:(0,0),(1,1)
int start = 0;
while (row > start * 2 && col > start * 2)
{
PrintMatrixInCircle(number, row, col, start);
start++;
}
printf("\n");
}
测试代码:
int main()
{
int arr[3][3] = { { 1,2,3 },{ 4 },{ 7 } };
PrintMatrixClockwise(arr, 3, 3);
return 0;
}
对于此代码,我将其设置为如果出现0的话就不会遍历打印,只对非0的数进行遍历打印。