zoukankan      html  css  js  c++  java
  • 【剑指offer】顺时针打印矩阵,C++实现

    原创文章,转载请注明出处!

    博客文章索引地址

    1.题目

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

                                                                                                                  image_thumb[12]

    2.思路

          把矩阵看成由若干个顺时针方向的圈组成,循环打印矩阵中的每个圈,每次循环打印一个圈。打印一圈通常分为四步,第一步从左到右打印一行;第二步从上到下打印一列;第三步从右到左打印一行;第四步从下到上打印一列。设置四个变量left,right,top,btm,用于表示圈的方位,每一步根据起始坐标和终止坐标循环打印。

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

    • 打印第一步,第一步总是需要的。

    image_thumb[19]

    • 打印第二步的前提条件是(top<btm)

    image_thumb[20]

    • 打印第三步的前提条件是(top<btm && left<right)

    image_thumb[21]

    • 打印第四步的前提条件是(top+1<btm&&left<right)

    image_thumb[22]

    3.code

      1 class Solution {
      2 public:
      3     vector<int> printMatrix(vector<vector<int> > matrix) {
      4         // 存储结果
      5         vector<int> result;
      6         // 边界条件
      7         if(matrix.empty())
      8             return result;
      9         // 二维矩阵行列
     10         int rows = matrix.size();
     11         int cols = matrix[0].size();
     12         // 圈的四个角标
     13         int left = 0;
     14         int right = cols-1;
     15         int top = 0;
     16         int btm = rows-1;
     17         // 循环打印圈
     18         while(left <= right && top <= btm){             // 循环条件:
     19             // 圈的第一步
     20             for(int i=left;i<=right;++i)                // 第一步循环条件
     21                 result.push_back(matrix[top][i]);       // 第一步坐标
     22             // 圈的第二步
     23             if(top<btm)                                 // 第二步边界条件
     24                 for(int i=top+1;i<=btm;++i)             // 第二步循环条件
     25                     result.push_back(matrix[i][right]); // 第二步坐标
     26             // 圈的第三步
     27             if(top<btm && left<right)                   // 第三步边界条件
     28                 for(int i=right-1;i>=left;--i)          // 第三步循环条件
     29                     result.push_back(matrix[btm][i]);   // 第三步坐标
     30             // 圈的第四步
     31             if(top+1<btm && left<right)                 // 第四步边界条件
     32                 for(int i=btm-1;i>=top+1;--i)           // 第四步循环条件
     33                     result.push_back(matrix[i][left]);  // 第四步坐标
     34 
     35             ++left;--right;++top;--btm;
     36         }
     37         return result;
     38     }
     39 };
  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/8617424.html
Copyright © 2011-2022 走看看