zoukankan      html  css  js  c++  java
  • 顺时针打印矩阵

    忍不住吐槽,

    好久没有写算法类的代码了,感觉脑子有坑.

    写逆时针矩阵用vector<vector<int>>做,(其实用数组也可以)

    结果总是在边界出错.

    往下走i是加,往左走i是减.

    吐槽一下,真的是,全是坑,我说的是脑子

     1 //
     2 // Created by Arc on 2020/5/25.
     3 //
     4 /*
     5  * 把一个数字矩阵,按照瞬时针输出成另一个矩阵
     6  * 比如
     7  * 1 2 3
     8  * 4 5 6
     9  * 7 8 9
    10  * 逆时针一下就是
    11  * 1 2 3
    12  * 6 9 8
    13  * 7 4 5
    14  *
    15  * 
    16  * */
    17 #include <iostream>
    18 #include<vector>
    19 #include <math.h>
    20 using  namespace std;
    21 void spiralOrder(vector<vector<int>>& matrix){
    22     /*判断是否为空*/
    23     int m=matrix.size();
    24     int n=matrix[0].size();
    25     if(m == 0 || n == 0)
    26         cout<<"0";
    27     /*设置上下左右四个界限*/
    28     vector<int> ans;
    29     int top = 0;
    30     int bottom = m - 1;
    31     int left = 0;
    32     int right = n - 1;
    33     /*此算法模拟顺时针输出的过程,请联想打印过程*/
    34     while(true)
    35     {
    36         /*1.top行从左到右遍历*/
    37         for(int i=left;i<=right;i++){
    38             ans.push_back(matrix[top][i]);
    39 
    40         }
    41         /*top移动至下一行,并进行边界检测*/
    42         top++;
    43         if(top > bottom ) break;
    44 
    45         /*2.right列从上到下遍历*/
    46         for(int i=top;i<=bottom;i++){
    47             ans.push_back(matrix[i][right]);
    48 
    49 
    50         }
    51         /*right左移,并进行边界检测*/
    52         right--;
    53         if(right < left) break;
    54 
    55         /*3.bottom行从右往左遍历*/
    56         for(int i = right;i>=left;i--){
    57             ans.push_back( matrix[bottom][i]);
    58 
    59 
    60         }
    61         /*bottom行上移,并进行边界检测*/
    62         bottom -- ;
    63         if(bottom < top) break;
    64         /*4.left列从下往上遍历*/
    65         for(int i=bottom;i>=top;i--){
    66             ans.push_back(matrix[i][left]);
    67 
    68             if(i==top)
    69                 cout<<endl;
    70         }
    71         /*left右移,并进行边界检测*/
    72         left++;
    73         if(left > right) break;
    74     }
    75     /*返回遍历结果*/
    76     int num=ans.size();
    77     int sq=sqrt(num+1);
    78     for(int i=0;i<num;i++){
    79         cout<<ans[i];
    80         if((i+1)%sq)
    81             cout<<" ";
    82         else cout<<endl;
    83     }
    84 }
    85 int main() {
    86     vector<vector<int>> array ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    87     spiralOrder(array);
    88     return 0;
    89 
    90 }
  • 相关阅读:
    objectiveC中的序列化(serialize)与反序列化(deserialize)
    objectiveC 的代码文件组织
    [转载]Multicast Explained in Flash 10.1 P2P
    几种异步操作方式
    objectiveC 的内存管理之自动释放池(autorelease pool)
    用VS2010调试微软开放的部分源码
    浏览器窗口尺寸改变时的图片自动重新定位
    数据结构C#版笔记啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)
    objectiveC 的内存管理之实例分析
    objectiveC 的OOP(上)类定义、继承及方法调用
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/12958115.html
Copyright © 2011-2022 走看看