• 螺旋矩阵、旋转矩阵、矩阵Z字打印


    螺旋矩阵

    在这里插入图片描述

    #include 
    #include 
    void display(std::vector<std::vector<int>>&nums){
           for(int i = 0; i < nums.size(); ++i){
                 for(int j = 0; j < nums[0].size(); ++j){
                       std::cout<<nums[i][j]<<' ';
                 }
                 std::cout<<std::endl;
           }
    }
    void Process(int x1, int y1, int x2, int y2, std::vector<std::vector<int>>&nums){
          if(x1 == x2){
                while (y1 <= y2)
                {
                      std::cout<<nums[x1][y1++]<<' ';
                }    
          } else if(y1 == y2){
                while (x1 <= x2)
                {
                      std::cout<<nums[x1++][y1]<<' ';
                }    
          }else{
                for(int i = y1; i <= y2; ++i){
                      std::cout<<nums[x1][i]<<' ';
                }
                for(int i = x1 + 1; i <= x2; ++i){
                      std::cout<<nums[i][y2]<<' ';
                }
                for(int i = y2 - 1; i >= y1; --i){
                      std::cout<<nums[x2][i]<<' ';
                }
                for(int i = x2 - 1; i > x1; --i){
                       std::cout<<nums[i][y1]<<' ';
                }
          }
    }
    int main(){
        std::vector<std::vector<int>>nums;
        int n = 6;
        int m = 6;
        nums.resize(n);
        int num = 1;
        for(int i = 0; i < n;  ++i){
            std::vector<int>tmp(m, 0);
            for(int j = 0; j < m; ++j){
                 tmp[j] = num++;
            }
            nums[i] = tmp;
        }
        display(nums);
        // 矩阵类型的题目可以枚举一些特殊的点来做左上角点和右下角点, 然后在往内部收缩
        int x1 = 0, y1 = 0, x2 = n-1, y2 = m-1;
        while (x1 <= x2)
        {
            Process(x1, y1, x2, y2, nums);
            ++x1;
            ++y1;
            --x2;
            --y2;
        }
        
        std::getchar();
     
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    旋转矩阵

    类似于这个螺旋矩阵我们也是在每次处理最外层的矩形,然后往内收缩。
    对于一个矩形我们选取四个点依次进行交换即可

    #include 
    #include 
    void display(std::vector<std::vector<int>>&nums){
           for(int i = 0; i < nums.size(); ++i){
                 for(int j = 0; j < nums[0].size(); ++j){
                       std::cout<<nums[i][j]<<' ';
                 }
                 std::cout<<std::endl;
           }
    }
    void Process(int x1, int y1, int x2, int y2, std::vector<std::vector<int>>&nums){
          if(x1 == x2){
                while (y1 <= y2)
                {
                      std::cout<<nums[x1][y1++]<<' ';
                }    
          } else if(y1 == y2){
                while (x1 <= x2)
                {
                      std::cout<<nums[x1++][y1]<<' ';
                }    
          }else{
                for(int i = y1; i <= y2; ++i){
                      std::cout<<nums[x1][i]<<' ';
                }
                for(int i = x1 + 1; i <= x2; ++i){
                      std::cout<<nums[i][y2]<<' ';
                }
                for(int i = y2 - 1; i >= y1; --i){
                      std::cout<<nums[x2][i]<<' ';
                }
                for(int i = x2 - 1; i > x1; --i){
                       std::cout<<nums[i][y1]<<' ';
                }
          }
    }
    int main(){
        std::vector<std::vector<int>>nums;
        int n = 4;
        int m = 4;
        nums.resize(n);
        int num = 1;
        for(int i = 0; i < n;  ++i){
            std::vector<int>tmp(m, 0);
            for(int j = 0; j < m; ++j){
                 tmp[j] = num++;
            }
            nums[i] = tmp;
        }
        display(nums);
        // 枚举矩阵的四个点把最外圈的给调整好再往内圈收缩
        int x1, y1, x2, y2, x3, y3, x4, y4;
        int count = 0;
    
        while(count < n -2){
              x1 = count, y1 = count;
              x2 = count, y2 = n - 1 - count;
              x3 = n - 1 - count, y3 = count;
              x4 = n - 1 - count, y4 = n - 1 - count;
              while(y1 < y2 && x2 < x4 && y4 > y3 && x3 > x1){
                    std::swap(nums[x1][y1], nums[x2][y2]);
                    std::swap(nums[x1][y1], nums[x4][y4]);
                    std::swap(nums[x1][y1], nums[x3][y3]);
                    ++y1;
                    ++x2;
                    --y4;
                    --x3;
                    
              }
              ++count;
        }
        display(nums);
       
        
        std::getchar();
     
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    矩阵Z字打印

    也是和螺旋矩阵类似选取两个点进行循环

    #include 
    #include 
    void display(int x1, int y1, int x2, int y2, std::vector<std::string>&strs){
          if(x1 < x2){
               while ( x1 <= x2 )
               {
                    std::cout<<strs[x1++][y1--]<<' ';
               }
               std::cout<<std::endl;      
          } else{
               while ( x1 >= x2  )
               {
                    std::cout<<strs[x1--][y1++]<<' ';
               }
               std::cout<<std::endl;          
          }
    }
    int main(){
         std::vector<std::string>strs = {"abcd", "efgh", "jklh"};
         int n = strs.size();
         int m = strs[0].size();
         int x1 = 0, y1 = 0;
         int x2 = 0, y2 = 0;
         int num = 0;
         while(x1 < n){
              if(num % 2 == 0){
                   display(x1, y1, x2, y2, strs);
              } else{
                   display(x2, y2, x1, y1, strs);
              }
              if(y1 < m - 1){
                  y1++;
              }else{
                  x1++;
              }
              if(x2 < n - 1){
                  x2++;
              }else{
                  y2++;
              }
              num++;
         } 
         std::getchar();
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    矩阵打印的题目可以从选取若干个点然后处理一层之后再往内进行收缩的做法先进行考虑

  • 相关阅读:
    什么是芯片的启动电压与欠压锁定?电源芯片测试如何助力?
    canvas绘制动态视频并且在视频上加上自定义logo
    【Paraview教程】第一章安装与基础介绍
    Jetpack架构组件_1.基本知识
    使用聚类(K-means)分析方法对骑手进行分类标签定义
    如何自己实现一个丝滑的流程图绘制工具(九) 自定义连接线
    毕业季 | 华为专家亲授面试秘诀:如何拿到大厂高薪offer?
    你知道数据库有哪些约束吗?
    UE5笔记【四】UE5主材质Master Materials和材质实例MI
    基于 Jenkins 搭建一套 CI/CD 系统
  • 原文地址:https://blog.csdn.net/qq_44741914/article/details/132606158