螺旋矩阵
#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();
}
旋转矩阵
类似于这个螺旋矩阵我们也是在每次处理最外层的矩形,然后往内收缩。
对于一个矩形我们选取四个点依次进行交换即可文章来源:https://www.toymoban.com/news/detail-694286.html
#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字打印
也是和螺旋矩阵类似选取两个点进行循环文章来源地址https://www.toymoban.com/news/detail-694286.html
#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();
}
矩阵打印的题目可以从选取若干个点然后处理一层之后再往内进行收缩的做法先进行考虑
到了这里,关于螺旋矩阵、旋转矩阵、矩阵Z字打印的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!