【剑指offer】面试题20:顺时针打印矩阵

来源:互联网 发布:淘宝坡跟女鞋 编辑:程序博客网 时间:2024/06/06 02:39

//题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.
// 例如矩阵: 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]);        }    }}
0 0
原创粉丝点击