我是靠谱客的博主 自觉小懒猪,最近开发中收集的这篇文章主要介绍剑指Offer第20题(顺时针打印矩阵),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

(本博客旨在个人总结回顾)

题目描述:

       输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如 :如果输入如下矩阵:

解题思路:

问题明显需要需要和判断临界条件来输出结果。

所以需要清晰打印思路:一层一层打印,先打印出第一层,再打印出第二层,依次打印完。

完整代码: 

#include "stdafx.h"
#include <iostream>
using namespace std;


/*
 * @name   PrintMatrixRect
 * @brief  顺时针打印矩阵某一层(从外到里)
 * @param  [in] int** pMatrix       二维数组(矩阵)
 * @param  [in] int nColumns        行数
 * @param  [in] int nRows           列数
 * @param  [in] int nIndex          (第几层,从0开始,0为最外层)    
 * @return void
 */
void PrintMatrixRect(int** pMatrix, int nColumns, int nRows, int nIndex)
{
    if (NULL == pMatrix || nColumns <= 0 || nRows <= 0)
    {
        return;
    }
    //输出上行
    int rowTop = nIndex;
    int column = nIndex;
    for (; column < nColumns - nIndex; column++)
    {
        cout << pMatrix[rowTop][column] << " ";
    }
    //输出右列
    int row = nIndex + 1;
    int columnRight = nColumns - 1 - nIndex;
    for (; row < nRows - nIndex; row++)
    {
        cout << pMatrix[row][columnRight] << " ";
    }
    //输出下行
    int rowBottom = nRows - 1 - nIndex;
    if (rowBottom != rowTop)
    {        
        column = nColumns - nIndex - 2;
        for (; column > nIndex; column--)
        {
            cout << pMatrix[rowBottom][column] << " ";
        }
    }
    //输出左列
    int columnLeft = nIndex;
    if (columnLeft != columnRight)
    {
        row = nRows - 1 - nIndex;
        for (; row > nIndex; row--)
        {
            cout << pMatrix[row][column] << " ";
        }
    }
}

/*
 * @name   PrintMatrixClockwisely
 * @brief  顺时针从外往里打印矩阵
 * @param  [in] int * * pMatrix 二维数组指针(矩阵)
 * @param  [in] int nColumns    列数
 * @param  [in] int nRows       行数
 * @return void
 */
void PrintMatrixClockwisely(int** pMatrix, int nColumns, int nRows)
{
    if (NULL == pMatrix || nColumns <= 0 || nRows <= 0)
    {
        return;
    }
    int nIndex = 0;
    while (nIndex <= nColumns / 2 && nIndex <= nRows / 2)
    {
        PrintMatrixRect(pMatrix, nColumns, nRows, nIndex);
        nIndex++;
    }
    cout << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    //测试例子:多行多列
    int arr1[4][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
        {13, 14, 15, 16}
    };    
    int *array1[4];//指针数组
    for (int i = 0; i < 4; i++)
    {
        array1[i] = arr1[i];
    }
    PrintMatrixClockwisely(array1, 4, 4);

    //测试例子:一行多列
    int arr2[1][4] = {
        { 1, 2, 3, 4 }
    };
    int *array2[1];
    for (int i = 0; i < 1; i++)
    {
        array2[i] = arr2[i];
    }
    PrintMatrixClockwisely(array2, 4, 1);

    //测试例子:多行一列
    int arr3[4][1] = {
        { 1},
        { 5},
        { 9},
        { 13}
    };
    int *array3[4];//指针数组
    for (int i = 0; i < 4; i++)
    {
        array3[i] = arr3[i];
    }
    PrintMatrixClockwisely(array3, 1, 4);

    //测试例子:一行一列
    int arr4[1][1] = {
        { 1 }
    };
    int *array4[1];
    for (int i = 0; i < 1; i++)
    {
        array4[i] = arr4[i];
    }
    PrintMatrixClockwisely(array4, 1, 1);
    PrintMatrixClockwisely(NULL, 1, 1);
    system("pause");
    return 0;
}

运行结果:

最后

以上就是自觉小懒猪为你收集整理的剑指Offer第20题(顺时针打印矩阵)的全部内容,希望文章能够帮你解决剑指Offer第20题(顺时针打印矩阵)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(293)

评论列表共有 0 条评论

立即
投稿
返回
顶部