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

螺旋矩阵

cpp 复制代码
#include <iostream>
#include <vector>
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();
 

}

旋转矩阵

类似于这个螺旋矩阵我们也是在每次处理最外层的矩形,然后往内收缩。

对于一个矩形我们选取四个点依次进行交换即可

cpp 复制代码
#include <iostream>
#include <vector>
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();
 

}

矩阵Z字打印

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

cpp 复制代码
#include <iostream>
#include <vector>
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();


}

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

相关推荐
草莓熊Lotso22 分钟前
《C++ Web 自动化测试实战:常用函数全解析与场景化应用指南》
前端·c++·python·dubbo
东巴图27 分钟前
分解如何利用c++修复小程序的BUG
开发语言·c++·bug
祁同伟.28 分钟前
【C++】二叉搜索树(图码详解)
开发语言·数据结构·c++·容器·stl
恒者走天下28 分钟前
AI智能网络检测项目(cpp c++项目)更新
开发语言·c++
Scc_hy40 分钟前
强化学习_Paper_2000_Eligibility Traces for Off-Policy Policy Evaluation
人工智能·深度学习·算法·强化学习·rl
Joy T1 小时前
Solidity智能合约存储与数据结构精要
数据结构·区块链·密码学·智能合约·solidity·合约function
leke20031 小时前
2025年10月17日
算法
CoovallyAIHub1 小时前
Mamba-3震撼登场!Transformer最强挑战者再进化,已进入ICLR 2026盲审
深度学习·算法·计算机视觉
海绵宝宝的好伙伴2 小时前
【数据结构】哈希表的理论与实现
数据结构·哈希算法·散列表
Aqua Cheng.2 小时前
代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
java·数据结构·算法·散列表