Grade 10 · Two-dimensional arrays (matrices)Citește în română
Generating a serpentine (zigzag) matrix
Original: Generarea matricei în serpentină
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
Input
3 4
Expected output
1 2 3 4 8 7 6 5 9 10 11 12
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.
/*
* 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.