Subiectul al II-lea, cerința 1
Tabloul format din rame concentrice
Subprogramul care atribuie o valoare elementelor unei rame dintr-un tablou bidimensional și programul C++ care construiește tabloul cu rame concentrice numerotate descrescător de la exterior spre interior.
Ce este o ramă
<p><q>rama este conturul pătratului format din liniile și coloanele cuprinse între p și q. Ea
este alcătuită din patru laturi:
- latura de sus: elementele de pe linia p, de la coloana p până la coloana q;
- latura de jos: elementele de pe linia q, de la coloana p până la coloana q;
- latura din stânga: elementele de pe coloana p, de la linia p până la linia q;
- latura din dreapta: elementele de pe coloana q, de la linia p până la linia q.
Cele patru colțuri aparțin la câte două laturi, deci sunt atinse de două ori. Atribuirea aceleiași valori de două ori nu schimbă rezultatul, așa că laturile se parcurg independent una de alta.
Când p = q, rama se reduce la un singur element, a[p][p]. Acesta este cazul ramei din centrul
tabloului, la valori impare ale lui n.
Câte rame are tabloul și ce valori primesc
La fiecare pas, rama următoare se obține prin mărirea liniei și a coloanei de început cu 1 și prin
micșorarea celor de sfârșit cu 1, deci rama de ordinul k este <k><n+1−k>rama. Ramele se opresc
când linia de început o depășește pe cea de sfârșit, adică atunci când k > n + 1 − k. Rezultă că
numărul ramelor este partea întreagă a lui (n + 1) / 2:
| n | Numărul ramelor | Ramele |
|---|---|---|
| 2 | 1 | <1><2> |
| 5 | 3 | <1><5>, <2><4>, <3><3> |
| 6 | 3 | <1><6>, <2><5>, <3><4> |
| 7 | 4 | <1><7>, <2><6>, <3><5>, <4><4> |
Valorile sunt numere naturale consecutive, strict descrescătoare de la exterior spre interior, iar
ultima este 1. Rezultă că rama din interior primește valoarea 1, cea dinaintea ei valoarea 2 și așa
mai departe, deci rama cea mai din exterior primește chiar numărul ramelor. Rama de ordinul k
primește valoarea nr − k + 1, unde nr este numărul ramelor.
Pentru n = 7 sunt 4 rame: <1><7> primește 4, <2><6> primește 3, <3><5> primește 2, iar
<4><4> primește 1, exact ca în exemplul din enunț.
Programul
#include <iostream>
using namespace std;
int a[51][51];
/* Atribuie valoarea x fiecarui element din <p><q>rama tabloului a: elementele
de pe liniile p si q, intre coloanele p si q, si cele de pe coloanele p si
q, intre liniile p si q. Tabloul se transmite prin adresa, deci tabloul
modificat este furnizat tot prin parametrul a. */
void pqrama(int a[51][51], int p, int q, int x) {
for (int j = p; j <= q; j++) {
a[p][j] = x; // latura de sus
a[q][j] = x; // latura de jos
}
for (int i = p; i <= q; i++) {
a[i][p] = x; // latura din stanga
a[i][q] = x; // latura din dreapta
}
}
int main() {
int n;
cin >> n;
int nr = (n + 1) / 2; // numarul ramelor concentrice
for (int k = 1; k <= nr; k++)
pqrama(a, k, n + 1 - k, nr - k + 1);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}
Rezolvarea se poate citi pe educamp.ro, la adresa de mai sus.
S-a încheiat minutul de citit liber.
Ce cuprinde rezolvarea
- Ce este o ramă
- Câte rame are tabloul și ce valori primesc
- Programul
- Verificarea pe exemplele din enunț
Vezi rezolvarea ca și cursant
Cel puțin o cerință din fiecare an este disponibilă gratuit și integral. Pentru a citi toate celelalte rezolvări ale disciplinei, te înscrii la cursul de pregătire.
Prima săptămână este gratuită, fără plată și fără card. Dacă vrei să vezi mai întâi cum este scrisă o rezolvare, poți reveni la prima cerință a anului.
100 RON / lună, pentru o disciplină
Ce cuprinde:
- Două întâlniri de câte două ore, în fiecare lună
- Tot suportul de curs publicat până acum la disciplina aleasă
- Capitole noi în fiecare săptămână, cuprinse în luna plătită, fără costuri suplimentare
- Material organizat după structura programei de examen
- Acces de pe orice dispozitiv, folosind același cont
- Prima săptămână gratuită, fără card și fără reînnoire automată
Ai întrebări sau o problemă? Scrie-mi pe WhatsApp, la 0745 874 576.