顺时针打印矩阵
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; }
以上是关于顺时针打印矩阵的主要内容,如果未能解决你的问题,请参考以下文章