C++矩阵的不同打印方式(转圈打印矩阵、方形矩阵顺时针旋转90度、“之”字形打印矩阵)

矩阵的不同打印方式

1、转圈打印矩阵

【题目】 给定一个整型矩阵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)。
1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16   
打印方式:12348121615141395671110

#include<iostream>
#include<vector>
using namespace std;
void printEdge(vector<vector<int>>matrix, int tR, int tC, int dR, int dC)
{
	if (tR == dR)//仅为横向数组
	{
		for (int i = 0; i <= dC; i++)
		{
			cout << matrix[tR][i] << " ";
		}

	}
	else if (tC == dC) //仅为纵向数组
	{
		for (int i = 0; i <= dR; i++)
		{
			cout << matrix[i][tC] << " ";
		}
	}
	else
	{
		int curC = tC;
		int curR = tR;
		while (curC != dC)
		{
			cout << matrix[tR][curC] << " ";
			curC++;
		}
		while (curR != dR)
		{
			cout << matrix[curR][dC] << " ";
			curR++;
		}
		while (curC != tC)
		{
			cout << matrix[dR][curC] << " ";
			curC--;
		}
		while (curR != tR)
		{
			cout << matrix[curR][tC] << " ";
			curR--;
		}
	}
}
void sprialOrderPrint(vector<vector<int>>matrix)
{
	int tR = 0;
	int tC = 0;
	int dR = matrix.size() - 1;
	int dC = matrix[0].size() - 1;
	while (tR <= dR && tC <= dC)
	{
		printEdge(matrix, tR++, tC++, dR--, dC--);//左上角向下,右上角向上,都是沿着对角线
	}
}

int main()
{
	vector<vector<int>>matrix = { { 1, 2, 3, 4 },{ 5, 6, 7, 8 },{ 9, 10, 11, 12 },{ 13, 14, 15, 16 } };
	sprialOrderPrint(matrix);
	cout << endl;
	system("pause");
	return 0;

}

在这里插入图片描述

2、方形矩阵顺时针旋转90度

在这里插入图片描述

#include<iostream>
#include<vector>

using namespace std;

//旋转最外圈的正方形
void  EdgeCircle(vector<vector<int>>& m, int tR, int tC, int dR, int dC)
{
	int times = dC - tC; //总的组数
	int temp = 0;
	//每次循环都是一组数据的调整
	for (int i = 0; i<times; i++)
	{
		temp = m[tR][tC + i];
		m[tR][tC + i] = m[dR - i][tC];
		m[dR - i][tC] = m[dR][dC - i];
		m[dR][dC - i] = m[tR + i][dC];
		m[tR + i][dC] = temp;
	}

}

void GetMatixTrans90(vector<vector<int>>& matrix)
{
	int tR = 0;
	int tC = 0;
	int dR = matrix.size() - 1;
	int dC = matrix[0].size() - 1;

	while (tR<dR)
	{
		EdgeCircle(matrix, tR++, tC++, dR--, dC--);
	}
}

void PrintMatrix(vector<vector<int>>& matrix)
{
	for (int i = 0; i<matrix.size(); i++)
	{
		for (int j = 0; j< matrix[0].size() ; j++)
		{
			cout << matrix[i][j] <<  " ";
		}
		cout << endl;
	}
}


int main()
{
	vector<vector<int>>matrix = { { 1, 2, 3, 4 },{ 5, 6, 7, 8 },{ 9, 10, 11, 12 },{ 13, 14, 15, 16 } };
	cout << "原始数据输出: " << endl;
	PrintMatrix(matrix);

	cout << "打印旋转后的矩阵输出: " << endl;
	GetMatixTrans90(matrix);
	PrintMatrix(matrix);

	system("pause");
	return 0;

}

在这里插入图片描述

3、“之”字形打印矩阵

题目描述:
给定一个矩阵matrix,按照“之”字形的方式打印这
个矩阵,例如:
1 2	 3	4
5 6  7	8
9 10 11 12
“之”字形打印的结果为:125963471011812

在这里插入图片描述

#include<iostream>
#include<vector>

using namespace std;

void printMatrixZigZag(vector<vector<int>>matrix, int aR, int aC, int bR, int bC,bool flag)
{
	if (flag)//从上往下打印
	{
		while (aR != bR + 1)// bR下面一行,没必要判断了
			cout << matrix[aR++][aC--] << " ";
	}
	else//从下往上打印
	{
		while (bR != aR - 1)// aR上面一行,没必要判断了
			cout<<matrix[bR--][bC++] << " ";
		
	}
}

void MatrixZigZag(vector<vector<int>>matrix)
{
	int aR = 0;
	int aC = 0;
	int bR = 0;
	int bC = 0;
	int endR = matrix.size() - 1;
	int endC = matrix[0].size() - 1;
	bool flag = false;
	while (aR != matrix.size())
	{
		printMatrixZigZag(matrix, aR, aC, bR, bC, flag);
		aR = aC == endC ? aR + 1 : aR ;
		aC = aC == endC ? aC : aC + 1;
		bC = bR == endR ? bC + 1 : bC;
		bR = bR == endR ? bR : bR + 1;//这两个的位置不能交换。可以这么理解,交换以后,当bR == endR时,bC + 1
		flag = !flag;
	}
}

int main()
{
	vector<vector<int>>matrix = { { 1, 2, 3, 4 },{ 5, 6, 7, 8 },{ 9, 10, 11, 12 } };
	MatrixZigZag(matrix);
	system("pause");
	return 0;
}

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值