Grade 10 · Two-dimensional arrays (matrices)Citește în română

Generating a serpentine (zigzag) matrix

Original: Generarea matricei în serpentină

O(n²)C++1755 lines2 examples

The idea

We fill the matrix with the numbers 1, 2, ..., n * m in a zigzag: odd rows from left to right, even rows from right to left. A counter val grows with every element written; only the direction we walk the columns depends on the parity of the row.

Original description (Romanian)

Completăm matricea cu numerele 1, 2, ..., n * m „în zigzag”: liniile impare de la stânga la dreapta, liniile pare de la dreapta la stânga. Un contor val crește la fiecare element scris; doar sensul în care mergem pe coloane depinde de paritatea liniei.

Complexity
O(n * m)
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

3 4

Expected output

1 2 3 4
8 7 6 5
9 10 11 12
Example 2

Input

2 2

Expected output

1 2
4 3

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

matrice-in-serpentina.cpp
/*
 * Titlu: Generarea matricei în serpentină
 * Clasa: 10
 * Capitol: Tablouri bidimensionale (matrice)
 * Descriere: Completăm matricea cu numerele 1, 2, ..., n * m „în zigzag”: liniile
 *            impare de la stânga la dreapta, liniile pare de la dreapta la stânga.
 *            Un contor val crește la fiecare element scris; doar sensul în care
 *            mergem pe coloane depinde de paritatea liniei.
 * Complexitate: O(n * m)
 *
 * Exemplu
 * Intrare: 3 4
 * Ieșire:
 * 1 2 3 4
 * 8 7 6 5
 * 9 10 11 12
 *
 * Exemplu
 * Intrare: 2 2
 * Ieșire:
 * 1 2
 * 4 3
 */
#include <iostream>
using namespace std;

int a[101][101];

int main()
{
    int n, m, val = 1;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        if (i % 2 == 1)
        {
            for (int j = 1; j <= m; j++)
                a[i][j] = val++;
        }
        else
        {
            for (int j = m; j >= 1; j--)
                a[i][j] = val++;
        }
    }

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            cout << a[i][j] << ' ';
        cout << '\n';
    }
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.