转圈打印矩阵
【题目】
给定一个整型矩阵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;
}