III.2 testul 1 (antrenament) 2020

Subiectul al III-lea – Exerciţiul 2

Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale din intervalul [2,20], n și k, şi construieşte în memorie un tablou bidimensional cu n linii şi n∙k coloane, numerotate începând cu 1, astfel încât fiecare linie i (i∈[1,n]) memorează un şir crescător de termeni cu proprietatea că primul termen este i, fiecare valoare apare în şir de exact k ori și oricare doi termeni alăturați au valori egale sau consecutive.
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe câte o linie a ecranului, cu valorile aflate pe aceeaşi linie separate prin câte un spaţiu. Exemplu: dacă n=4 și k=3, se afişează pe ecran tabloul alăturat.
 

Numerele n și k au valoarea maximă 20, așadar tabloul cu n∙k  coloane va avea cel mult 400  de coloane.  Liniile și coloanele fiind numerotate de la 1, avem declararea tabloului int a[21][401].

Elementele primei coloane sunt egale cu indicele liniei. Celelalte elemente sunt egale cu “vecinul” din stânga sau cu 1 mai mari decât “vecinul” din stânga (elementul situat pe aceeași linie și coloana anterioară). Grupele de câte k coloane cu elemente egale pot fi asociate cu restul împărțirii la k. Parcurgând o linie, cu ușurință se observă că schimbarea valorii unui element față de “vecinul” din stânga se face pe coloana cu indice de forma (1+ multiplu de k). De aici condiția j%k==1, unde j este indicele coloanei. 

#include<iostream>
using namespace std;
int main()
{
    int n,k,a[21][401],i,j;
    cin>>n>>k;
    for(i=1;i<=n;i++)
        for(j=1;j<=n*k;j++)
        if(j==1)
           a[i][j]=i;
        else
          if(j%k==1)
             a[i][j]=a[i][j-1]+1;
          else
             a[i][j]=a[i][j-1];
     for(i=1;i<=n;i++)
        {for(j=1;j<=n*k;j++)
           cout<<a[i][j]<<" ";
         cout<<endl;
        }
}