顺时针打印矩阵

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺时针打印矩阵相关的知识,希望对你有一定的参考价值。

题目

 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵,则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

技术分享图片

   把矩阵看成由若干个顺时针方向的圈组成,循环打印矩阵中的每个圈,每次循环打印一个圈。

  打印一圈通常分为四步,设置四个变量left,right,top,botm,用于表示圈的方位,每一步根据起始坐标和终止坐标循环打印。

  • 第一步从左到右打印一行,每圈至少有一步,不需加限制条件
  • 技术分享图片
  • 第二步从上到下打印一列,至少有两行,所以top<botm
  • 技术分享图片
  • 第三步从右到左打印一行,至少有两行,两列,所以top<botm,left<right
  • 技术分享图片
  • 第四步从下到上打印一列,至少有三行,两列,所以top+1<botm,left<right
  • 技术分享图片

 

注意:最后一圈有可能不需要四步,有可能只有一行,只有一列,只有一个数字,因此我们要仔细分析打印每一步的前提条件

#include <iostream>
#include <vector>
#include <fstream>
#define N 4
using namespace std;

class Solution
{
    public:
        void print_matrix_cricle(const vector<vector<int> > &v);
};

void Solution::print_matrix_cricle(const vector<vector<int> > &v)
{
    if(v.empty())
        return;
    
    int cols=v[0].size();
    int rows=v.size();
    
    int top=0;
    int left=0;
    int right=cols-1;
    int botm=rows-1;
    
    while(top<=botm&&left<=right)
    {
        //圈的第一步 
        for(int i=left;i<=right;++i)
            cout<<v[top][i]<<" ";
        
        //圈的第二步
        if(top<botm)
        for(int i=top+1;i<=botm;++i)
            cout<<v[i][right]<<" ";
        
        //圈的第三步
        if(top<botm&&left<right)
        for(int i=right-1;i>=left;--i)
            cout<<v[botm][i]<<" ";
        
        //圈的第四步
        if(top+1<botm&&left<right)
        for(int i=botm-1;i>=top+1;--i)
            cout<<v[i][left]<<" ";
        
        ++top;
        ++left;
        --right;
        --botm;
    }
}
int main()
{
    ifstream in("1.txt");
    vector<vector<int> > v(N,vector<int>(0));
    for(int i=0;i<N;++i)
    {
        v[i].resize(N);
        for(int j=0;j<N;++j)
            in>>v[i][j];
    }

       Solution s;
    s.print_matrix_cricle(v);
    
    return 0;
}

技术分享图片

以上是关于顺时针打印矩阵的主要内容,如果未能解决你的问题,请参考以下文章

顺时针打印矩阵

剑指offer--29顺时针打印矩阵

剑指offer 19.顺时针打印矩阵

顺时针打印矩阵

剑指offer:顺时针打印矩阵

剑指 Offer 29. 顺时针打印矩阵 的 详细题解