[编程题]"之"字形打印矩阵

3 篇文章 0 订阅
1 篇文章 0 订阅

[编程题]"之"字形打印矩阵

链接: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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值