Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Sursa generala pentru toate cele 4 probleme.
- * Diferentele (problemele 26 27 30 24) sunt puse in functii.
- *
- * Pentru a separa o problema de celelalte pur si simplu
- * se comenteaza apelul catre acea functie sau se sterge antetul, corpul dar si apelul functiei.
- *
- * De exemplu daca vrei problema 30 atunci stergi tot ce gasesti cu f26, f27 si f24
- * adica `void fXX() {...}` dar si `fXX()` sau doar comentezi cu `//` functiile respective din main.
- */
- #include <iostream>
- using namespace std; // pentru a nu folosi std::cin/std::cout (mingw, gnu compiler)
- const int N = 128; // dimensiunea maxima a vectorului
- int vec[N]; // vectorul
- int nr; // numar elemente
- void f26()
- {
- cout << "Afisez parintele si descendentii unui nod precizat.\n";
- cout << "Nod: ";
- int node;
- cin >> node;
- // afisam parintele, adica tatal nodului `node` adica `vec[node]`
- cout << "Parinte: " << vec[node] << endl;
- // acum descendentii, adica acele noduri ce au ca tata pe respectivul nod.
- cout << "Descendenti: ";
- for (int i = 1; i <= nr; ++i) if (vec[i] == node) cout << i << ' ';
- cout << endl;
- }
- void f27()
- {
- cout << "Afisez nodul radacina si nodurile care au exact 2 fii.\n";
- // radacina -> nodul al carui parinte este 0
- cout << "Radacina: ";
- for (int i = 1; i <= nr; ++i) {
- if (!vec[i]) {
- cout << i << endl;
- break;
- }
- }
- /* un nod are 2 fii daca el apare de 2 ori in vector
- pentru ca exista 2 noduri(fii) ce au acelasi parinte */
- cout << "Noduri cu 2 fii: ";
- // pentru asta cream un vector de frecventa
- int frv[N];
- // il umplem cu zerouri
- for (int i = 0; i < N; ++i) frv[i] = 0;
- // si acum numaram de cate ori apare un element
- for (int i = 1; i <= nr; ++i) ++frv[vec[i]];
- // si acum le afisam pe cele ce au fix 2 aparitii
- for (int i = 1; i <= nr; ++i) if (frv[i] == 2) cout << i << ' ';
- cout << endl;
- }
- void f30()
- {
- cout << "Afisez fratii tatalui unui nod dat.\n";
- cout << "Nod: ";
- int node;
- cin >> node;
- cout << "Frati ai tatalui: ";
- int tata = vec[node];
- if (!tata) {
- cout << "\nNodul este radacina, nu are tata." << endl;
- return; // iesim
- }
- // fratii tatalui sunt ceilalti fii ai bunicului sau tatal tatalui
- int tata2 = vec[tata];
- if (!tata2) { // tatal este radacina, deci nu are frati
- cout << endl;
- return; // iesim
- }
- // totul ok, afisam toate celelalte noduri (fara tata) ce au acelasi `tata2`
- for (int i = 1; i <= nr; ++i) {
- if (i == tata) continue; // sarim tatal nodului (trebuie sa-i afisam fratii)
- if (vec[i] == tata2) cout << i << ' ';
- }
- cout << endl;
- }
- void f24()
- {
- cout << "Afisez fratii unui nod precizat.\n";
- cout << "Nod: ";
- int node;
- cin >> node;
- cout << "Frati: ";
- int tata = vec[node];
- // afisam toate celelalte noduri ce au acelasi tata
- for (int i = 1; i <= nr; ++i) {
- if (i == node) continue; // sarim nodul curent
- // daca tatal lui i este chiar `tata` atunci nodul este un frate al lui `node`
- if (vec[i] == tata) cout << i << ' ';
- }
- cout << endl;
- }
- int main()
- {
- // citire
- cout << "Numar elemente: ";
- cin >> nr;
- cout << "Elemente: ";
- for (int i = 1; i <= nr; ++i) cin >> vec[i];
- // rezolvam pe rand toate cele 4 probleme
- f26();
- f27();
- f30();
- f24();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement