Parcurgerea matricei in spirala in C++
Publicat la 17 martie 2020 · algoritmi clasa 9 cpp
Cu ce ne ajută parcurgerea matricei pătratice în spirală?
În concursuri şi olimpiade apar probleme legate de parcurgerea matricei în spirală. Deşi ideea de bază este destul de uşoară, algoritmul îți poate da bătăi de cap.
Vom numi matricea a[n][n]
(cu n
linii şi coloane). Totodată, pentru uşurința înțelegerii, vom indexa matricea de la 1.
ATENȚIE! Formulele nu trebuie reținute, ci deduse.
Deducerea algoritmului
O primă observație este că practic noi mergem în patru sensuri, în mod repetat. Practic, pentru fiecare cadran al matricei, trebuie să facem acelaşi lucru, mergând din ce în ce mai puțin.
A doua observație esențială este că şi într-un singur cadran, noi parcurgem de 4 ori acelaşi număr de elemente, deoarece matricea este pătratică.
Luăm cazul în care n
este par. Atunci avem n / 2
cadrane. Pentru fiecare cadran i
, parcurgerea elementelor trebuie să se facă pe fiecare latură în parte, în ordinea: sus, dreapta, jos, stânga, adică:
(i, i) → (i, n - i)
(i, n - i + 1) → (n - i, n - i + 1)
(n - i + 1, n - i + 1) → (n - i + 1, i + 1)
(n - i + 1, i) → (i + 1, i)
Pentru celălalt caz, cu n
impar, practic facem exact la fel, dar avem grijă ca la final să prelucrăm şi elementul a[n / 2 + 1][n / 2 + 1]
(cel din centru).
Dă hover mai jos ca să vizualizezi mai uşor indicii unei matrici!
Implementarea algoritmului
Cam aşa ar arăta un cod corect:
#include <iostream>
using namespace std;
int n, a[101][101];
int main() {
//citirea datelor de intrare//pentru mai multe detalii: https://100din100.netlify.app
cin>>n;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
cin>>a[i][j];
for(int i = 1; i <= n / 2; i++) { //pentru fiecare cadran i://pentru mai multe detalii: https://100din100.netlify.app
for(int j = i; j <= n - i; ++j) //latura de sus//pentru mai multe detalii: https://100din100.netlify.app
cout<<a[i][j]<<" ";
for(int j = i; j <= n - i; ++j) //latura din dreapta//pentru mai multe detalii: https://100din100.netlify.app
cout<<a[j][n - i + 1]<<" ";
for(int j = n - i + 1; j >= i + 1; --j) //latura de jos//pentru mai multe detalii: https://100din100.netlify.app
cout<<a[n - i + 1][j]<<" ";
for(int j = n - i + 1; j >= i + 1; --j) //latura din stânga//pentru mai multe detalii: https://100din100.netlify.app
cout<<a[j][i]<<" ";
}
if(n % 2 == 1) //cazul special, când n
e impar//pentru mai multe detalii: https://100din100.netlify.app
cout<<a[n / 2 + 1][n / 2 + 1];
return 0;
}
Primul tau program, variabile si operatii - TUTORIAL COMPLET C++
Eşti elev de liceu şi nu înțelegi informatica? Acest clip ar trebui să te ajute să înțelegi cele mai elementare aspecte privind informatica de liceu - algoritmica...
Rezolvări probleme PbInfo
Problemele de informatică pot fi dificile uneori, şi este util să vedem o soluție bună pentru a ne autoverifica. De multe ori sunt necesare doar nişte modificări minore, de aceea este bine să analizăm soluțiile bune cu atenție!
Video - Probleme Rezolvate PbInfo
Aici gasiti rezolvarea mai multor probleme de pe site-ul pbinfo.ro, în format video, pe canalul nostru de YouTube.
Divizorii unui numar - tutorial incepatori in C++
Prezentul articol te va ajuta să îndeplineşti diferite aplicații cu divizorii unui număr.
Trebuie cunoscută parcurgerea divizorilor unui număr, înainte de toate, ca să ne asigurăm că ştim s…
Al doilea cel mai mic/mare element al unui sir in C++
Dându-se un şir de numere naturale distincte, aflați al doilea cel mai mic număr din şir.
Exemplu:Intrare
9 5 8 2 4
Ieşire
4
Explicație4
este al doilea cel mai mi…
Ciurul lui eratostene - generarea numerelor prime - olimpiada C++
Să zicem că vrem să aflăm dacă mai multe numere sunt sau nu prime. Desigur, putem aplica algoritmul de aflare a numărului de divizori pentru toate numerele, doar că dacă avem foarte multe şi sun…
Ce este coada/queue si cum functioneaza? Tutorial clasa a 10-a
Ce este coada?
Coada (Queue din engleză) este o structură de date liniară care funcționează prin inserarea elementelor noi la spate şi prin eliminarea elementelor doar prin față. Altfel spu…
Afişare cu 2 zecimale exacte, fără şi cu rotunjire - TUTORIAL C++
Tutorialul acesta te învață cum să afişezi un număr real cu mai multe zecimale exacte. Multe probleme cer...
Algoritmi elementari - video
Tutoriale uşor de urmărit, sub forma unor videoclipuri!
Sortarea vectorilor si a structurilor (pentru incepatori) in C++
Sortarea în informatică reprezintă procesul de a ordona un şir de obiecte (numere, caractere, sau chiar şiruri) după un anumit criteriu.
Spre exemplu, putem ordona crescător sau descrescăto…
Tablelul ASCII - clasa a X-a - char C++
Ce este tabelul ASCII?
Calculatorul reține numere (valori de 1
şi de 0
), aşadar a fost nevoie de o corespondență între numere şi caractere pentru a putea reprezenta litere, si…
Smenul lui Mars (Difference Arrays) in C++
Ce este Şmenul lui Mars?
Să zicem că avem un şir a[]
cu n
elemente. Unele probleme cer efectuarea unor operații de tipul sum(st, dr, val)
, cu semnificația că adunăm la …
Vectori caracteristici si vectori de frecventa - Materie Olimpiada Informatica C++
Ce este un vector de frecvență sau un vector caracteristic?
Vectorii caracteristici rețin dacă un element se află într-un vector sau nu. Similar, vectorii de frecvență rețin numărul de apar…
Parcurgerea matricei in spirala in C++
Cu ce ne ajută parcurgerea matricei pătratice în spirală?
În concursuri şi olimpiade apar probleme legate de parcurgerea matricei în spirală. Deşi ideea de bază este destul de uşoară, algor…
Creeaza un joc 2D in PYTHON pentru incepatori - Capitolul 0 (Instalare)
Care-i faza?
În aceste câteva tutoriale vom învăța cum să îți creezi propriul joc video în Python. Puteți viziona atât pe YouTube, cât şi în format text pe site-ul nostru (aici adică).
…
Tipuri de date in C++ si C - Tutorial Incepatori
De ce avem nevoie de date?
În timp ce lucrăm cu valori, avem nevoie (uneori chiar suntem siliți!) să memorăm datele undeva, în memorie. Prin intermediul variabilelor putem accesa o zonă de …
Sume partiale. Suma elementelor dintr-o submatrice in C++
Cu ce ne ajută sumele parțiale?
Unele probleme cer aflarea sumei elementelor unei secvențe dintr-un şir dat. Metoda naivă, care face suma tuturor elementelor din secvența cerută, deobicei n…
Verifica daca o data este valida in C++
Dându-se o dată (zi lună an), trebuie verificat dacă data este validă sau nu.
Exemplu:Intrare
zi = 3, luna = 4, an = 2021
Ieşire
DA
Pentru a verifica da…
Prelucrarea cifrelor unui numar pentru incepatori in C++
Acest articol urmăreşte aplicarea diferitelor aplicații cu cifrele unui număr: suma cifrelor, numărul de cifre, oglinditul unui număr ş.a.m.d. Puteți găsi multe probleme care cer prelucrarea cif…
Verifica daca un an este bisect in C++
Dându-se un an, trebuie verificat dacă este un an bisect sau nu.
Exemplu:Intrare
2021
Ieşire
NU
Definiția anului bisect
Deşi pare evident, anii bis…
Primul program - Operatori si expresii - Tutorial incepatori C++
Alcătuirea unui program pentru rezolvarea unei probleme se rezumă defapt la rezolvarea unor probleme mai mici. Spre exemplu, pentru a afla suma numerelor prime dintr-un şir, trebuie să ştim cum …
Citirea si Afisarea in fisiere in C++ - Tutorial Incepatori
De ce citirea din fişier?
De multe ori este necesară citirea şi afişarea în fişier, unul din motive fiind faptul că nu trebuie să reintroducem datele de intrare de fiecare dată când rulăm p…
Cautarea binara pentru olimpiada in C++
Ce este căutarea binară?
Să zicem că ai un vector a[]
cu n
elemente crescătoare. Căutarea binară este un algoritm eficient care determină dacă orice număr x
apare sau n…
Ridicarea la putere in timp logaritmic pentru olimpiada in C++
Un număr de forma b la puterea e
nu poate fi calculat precum celelalte operații (adunarea, scăderea, înmulțirea, împărțirea) pur şi simplu. În articolul acesta vom prezenta un mod foarte …