[编程题]"之"字形打印矩阵
链接:https://www.nowcoder.com/questionTerminal/d2efe600e73d47a2ba1533dc926cbb46
来源:牛客网
给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,如样例所示。
输入描述:
输入包含多行,第一行包含两个整数n和m(1≤n,m≤200),代表矩阵的行数和列数,接下来n行,每行m个整数,代表矩阵matrix(1≤matrix[i][j]≤40000)。
输出描述:
输出一行 ,代表“之”字形输出的矩阵。
示例1
输入
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出
1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16
备注:
额外空间复杂度O(1。
思路:这个题同样要求空间复杂度为O(1),从坐标(0,0)出发,设两个坐标(x1,y1),(x2,y2),如果y1小于列数,就让y1每次加1,否则,就让x1加一(先往右边走,走到最右边,往下走),如果x2小于行数,让x2每次加1,否则,就让y2加1(先往下走,走到最下边,往右边走),每次打印两个坐标之间的所有数据就行了,比如(2,0)(0,2),就打印9,6,3就可以了,然后加一个bool变量去控制正反打印就好!
代码:
#include<iostream>
#include<vector>
using namespace std;
bool flag = false;
//打印
void Print(vector<vector<int>> vv, int x1, int y1, int x2, int y2)
{
if (flag)
{
while (x2 >= x1 && y2 <= y1)
{
cout << vv[x1][y1] << ' ';
x1++;
y1--;
}
flag = false;
}
else
{
while (x2 >= x1 && y2 <= y1)
{
cout << vv[x2][y2] << ' ';
x2--;
y2++;
}
flag = true;
}
}
//找两个坐标
void Print_z(vector<vector<int>> vv)
{
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
while (x1 < (int)vv.size() || y2 < (int)vv[0].size())
{
Print(vv, x1, y1, x2, y2);
if (y1 < (int)vv[0].size()-1)
y1++;
else
x1++;
if (x2 < (int)vv.size()-1)
x2++;
else
y2++;
}
}
int main()
{
int n, m;
while (cin >> n >> m)
{
vector<vector<int>> vv(n, vector<int>(m));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> vv[i][j];
}
}
Print_z(vv);
}
return 0;
}