剑指offer| |顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:
如果输入以下矩阵:
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的数进行遍历打印。

猜你喜欢

转载自blog.csdn.net/qq_40399012/article/details/82288097