二维数组的转圈打印和“之”字打印

本文介绍两种特殊的矩阵打印方法:转圈打印和“之”字打印。转圈打印通过四个变量标记矩阵边界并用四个while循环实现;“之”字打印则通过判断方向变化,交替打印从左上到右下及从右下到左上的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


       本次的代码是转圈打印和“之”字打印,两道题的基本思路是一致的,主要锻炼的是代码实现技巧。在转圈打印中,通过左上点和右下点就能标记出一个矩阵;“之”字打印中,对于左边变化的判断是需要熟练的。


1.转圈打印矩阵

#include "Array_matrix8_1.h"
#include "iostream"
using namespace std;

#define N 4
#define M 4
Array_matrix8_1::Array_matrix8_1()
{
    //ctor
}

Array_matrix8_1::~Array_matrix8_1()
{
    //dtor
}

/*
    不要纠结于坐标怎么上下左右动
    4个变量标记一个矩阵,4个while循环

*/
void printEdge(int mat1[N][M],int ro1,int ro2,int co1,int co2)
{

    int cur1=co1;
    int cur2=ro1;
    while(cur1!=co2){   //***可直接用“!=”减少多余的考虑
        cout<<mat1[ro1][cur1]<<" ";
        cur1++;
    }
    while(cur2!=ro2){
        cout<<mat1[cur2][co2]<<" ";
        cur2++;
    }
    while(cur1!=co1){
        cout<<mat1[ro2][cur1]<<" ";
        cur1--;
    }
    while(cur2!=ro1){
        cout<<mat1[cur2][co1]<<" ";
        cur2--;
    }
}

void spiralOrderPrint(int mat[N][M])
{
    int row1=0;         //左上点的横坐标
    int row2=N-1;       //右下点的横坐标
    int col1=0;
    int col2=M-1;
    while(row1<=row2&&col1<=col2)
    {
       // printEdge(mat,row1++,row2--,col1++,col2--);

        printEdge(mat,row1,row2,col1,col2);
        row1++;
        row2--;
        col1++;
        col2--;
    }

}



int main()
{
    int matrix[N][M]={1,2,3,4,5,6,7,8,4,3,2,1,8,7,6,5};

    spiralOrderPrint(matrix);
    return 0;
}






2.“之”字打印

#include "Array_matrix8_3.h"
#include "iostream"
using namespace std;

#define N 4
#define M 4

Array_matrix8_3::Array_matrix8_3()
{
    //ctor
}

Array_matrix8_3::~Array_matrix8_3()
{
    //dtor
}

void print_level(int ma[N][M],int ro1,int ro2,int co1,int co2,bool fl){

    if(fl){
        while(ro1!=ro2+1){
            cout<<ma[ro1++][co1--]<<" ";

        }

    }else{
        while(ro2!=ro1-1){
            cout<<ma[ro2--][co2++]<<" ";
        }
    }
}


void Zhizi_Print(int mat[N][M])
{
  int row1=0;  //(row1,col1)横向走的坐标   (row2,col2)纵向走的坐标
  int row2=0;
  int col1=0;
  int col2=0;
  int endrow=N-1;
  int endcol=M-1;
  bool flag=false;
  while(row1!=endrow+1){
    print_level(mat,row1,row2,col1,col2,flag);

    row1= col1==endcol ? row1+1:row1;       //如果走到的最后一列横坐标加1
    col1= col1==endcol ? col1  :col1+1;     //如果没有走到最后一列纵坐标加1
    col2= row2==endrow ? col2+1:col2;
    row2= row2==endrow ? row2  :row2+1;
    flag= !flag;                            //flag==true :右上 ->左下,flag==false :左下 ->右上

  }

}



int main()
{
    int matrix[N][M]={ {1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};
    Zhizi_Print(matrix);
    return 0;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值