矩阵的不同打印方式
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
打印方式:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11, 10
#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
“之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12
#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;
}