和左神一起练算法:转圈打印矩阵,’之‘字型打印

本文介绍两种矩阵打印算法:转圈打印与之字形打印。转圈打印按顺时针方向逐层遍历矩阵,而之字形打印则以Z字形路径遍历。两种算法均实现O(1)空间复杂度。

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

转圈打印矩阵
【题目】
给定一个整型矩阵matrix,请按照转圈的方式打印它。
例如:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11, 10
【要求】 额外空间复杂度为O(1)。

#include<iostream>
using namespace std;
void MYprintf(int a[4][4],int x1,int y1,int x2,int y2)    //这个是我们的打印函数,我们用来打印,传入了四个点,代表的是两个顶点,一个是左上角,一个是右下角
{
 	int COL_1 = x1;         //这里用了四个变量来记录四个顶点,在是正方形的矩阵的时候可以采用两个变量来记录,因为x,y是相等的
 	int COL_2 = x2;         //但是这里我用了四个变量,是因为可以接受不是正方形的矩阵
 	int ROW_1 = y1;
 	int ROW_2 = y2;
 	if (x1 > x2)     //这是一个判断,如果左顶点低于右顶点
 	{
  		return;
 	}
 	if (x1 == x2)          //如果相等那么就是说是一行,那么只需要把这一行打印出来就可以了
 	{
  		for (int i = COL_1; COL_1 <= y2; ++i)
  		{
   			cout << a[x1][i] << endl;
  		}
 	}
 	else         //否则的话就是转圈打印,每次打印,打印到最后一个的时候停止不打印
 	{
  		while (ROW_1 != ROW_2)
  		{
   			cout << a[COL_1][ROW_1] << endl;
   			ROW_1++;
  		}
  		ROW_1 = x1;             //打印完之后再还原回去
  		while (COL_1 != COL_2)
  		{
   			cout << a[COL_1][ROW_2] << endl;
   			COL_1++;
  		}
  		COL_1 = x1;            //打印完之后再还原回去
  		while (ROW_2 != ROW_1)
  		{
   			cout << a[COL_2][ROW_2] << endl;
   			ROW_2--;
  		}
  		ROW_2 = y2;              //打印完之后再还原回去
  		while (COL_2 != COL_1)
  		{
   			cout << a[COL_2][ROW_1] << endl;
   			COL_2--;
  		}
  		COL_2 = x2;        //打印完之后再还原回去
 	}
 	MYprintf(a,++x1, ++y1, --x2, --y2);      //完了之后再打内部的那一圈
}
int main()
{
 	int a[4][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
 	MYprintf(a, 0, 0, 3, 3);    //把左上角和右下角的两个点传进去
 	return 0;
}

在这里插入图片描述
之字形打印:

“之”字形打印矩阵
【题目】 给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,
例如:
1 2 3 4
5 6 7 8
9 10 11 12
“之”字形打印的结果为:
1,2,5,9,6,3,4,7,10,11,8,12
【要求】 额外空间复杂度为O(1)。

```
#include<iostream>
using namespace std;
void printfs(int a[3][4], int ROW_1, int COL_1, int ROW_2, int COL_2,bool test)//这个函数是用来判断到底是正向打印还是反向打印的
{
	 if (test)
 	{
  		while (ROW_1 <= ROW_2)
   		cout << a[ROW_1++][COL_1--] << endl;  //为真的话就从上向下打印
 	}
 	else
 	{
  		while (ROW_1  <= ROW_2)
   		cout << a[ROW_2--][COL_2++] << endl;   //为假的话就从下向上打印
 	}
}
void MYprintf(int a[3][4])
{
 	int ROW_1 = 0;//刚开始定义两个点,都指向0,0的位置,然后一个点向下移动,在碰到坐下之后向右移动,另一个点先向右移动,在碰到右上之后向下移动,两个点相交到右下打印结束
 	int COL_1 = 0;
 	int ROW_2 = 0;
 	int COL_2 = 0;
 	int ENDR = 2;//这两个点标记右下的角
 	int ENDC = 3;
 	bool test = false; //判断是正向打印还是反向打印的参数,bool类型的test,初始给的是false
 	while (ROW_1 != ENDR + 1)
 	{
 		 printfs(a, ROW_1, COL_1, ROW_2, COL_2, test);
  		ROW_1 = (COL_1 == ENDC) ? ROW_1 + 1 : ROW_1;//四个值进行变换
  		COL_1 = (COL_1 == ENDC) ? COL_1 : COL_1 + 1;
  		COL_2 = (ROW_2 == ENDR) ? COL_2 + 1 : COL_2;
  		ROW_2 = (ROW_2 == ENDR) ? ROW_2 : ROW_2 + 1;
  		test = !test;//取反
 	}
}
int main()
{
 	int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
 	MYprintf(a);
 	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值