Advertisement
cmiN

vec-arb

May 8th, 2012
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.49 KB | None | 0 0
  1. /*
  2.  * Sursa generala pentru toate cele 4 probleme.
  3.  * Diferentele (problemele 26 27 30 24) sunt puse in functii.
  4.  *
  5.  * Pentru a separa o problema de celelalte pur si simplu
  6.  * se comenteaza apelul catre acea functie sau se sterge antetul, corpul dar si apelul functiei.
  7.  *
  8.  * De exemplu daca vrei problema 30 atunci stergi tot ce gasesti cu f26, f27 si f24
  9.  * adica `void fXX() {...}` dar si `fXX()` sau doar comentezi cu `//` functiile respective din main.
  10.  */
  11.  
  12.  
  13. #include <iostream>
  14. using namespace std; // pentru a nu folosi std::cin/std::cout (mingw, gnu compiler)
  15.  
  16.  
  17. const int N = 128; // dimensiunea maxima a vectorului
  18. int vec[N]; // vectorul
  19. int nr; // numar elemente
  20.  
  21.  
  22. void f26()
  23. {
  24.     cout << "Afisez parintele si descendentii unui nod precizat.\n";
  25.     cout << "Nod: ";
  26.     int node;
  27.     cin >> node;
  28.     // afisam parintele, adica tatal nodului `node` adica `vec[node]`
  29.     cout << "Parinte: " << vec[node] << endl;
  30.     // acum descendentii, adica acele noduri ce au ca tata pe respectivul nod.
  31.     cout << "Descendenti: ";
  32.     for (int i = 1; i <= nr; ++i) if (vec[i] == node) cout << i << ' ';
  33.     cout << endl;
  34. }
  35.  
  36.  
  37. void f27()
  38. {
  39.     cout << "Afisez nodul radacina si nodurile care au exact 2 fii.\n";
  40.     // radacina -> nodul al carui parinte este 0
  41.     cout << "Radacina: ";
  42.     for (int i = 1; i <= nr; ++i) {
  43.         if (!vec[i]) {
  44.             cout << i << endl;
  45.             break;
  46.         }
  47.     }
  48.     /* un nod are 2 fii daca el apare de 2 ori in vector
  49.        pentru ca exista 2 noduri(fii) ce au acelasi parinte */
  50.     cout << "Noduri cu 2 fii: ";
  51.     // pentru asta cream un vector de frecventa
  52.     int frv[N];
  53.     // il umplem cu zerouri
  54.     for (int i = 0; i < N; ++i) frv[i] = 0;
  55.     // si acum numaram de cate ori apare un element
  56.     for (int i = 1; i <= nr; ++i) ++frv[vec[i]];
  57.     // si acum le afisam pe cele ce au fix 2 aparitii
  58.     for (int i = 1; i <= nr; ++i) if (frv[i] == 2) cout << i << ' ';
  59.     cout << endl;
  60. }
  61.  
  62.  
  63. void f30()
  64. {
  65.     cout << "Afisez fratii tatalui unui nod dat.\n";
  66.     cout << "Nod: ";
  67.     int node;
  68.     cin >> node;
  69.     cout << "Frati ai tatalui: ";
  70.     int tata = vec[node];
  71.     if (!tata) {
  72.         cout << "\nNodul este radacina, nu are tata." << endl;
  73.         return; // iesim
  74.     }
  75.     // fratii tatalui sunt ceilalti fii ai bunicului sau tatal tatalui
  76.     int tata2 = vec[tata];
  77.     if (!tata2) { // tatal este radacina, deci nu are frati
  78.         cout << endl;
  79.         return; // iesim
  80.     }
  81.     // totul ok, afisam toate celelalte noduri (fara tata) ce au acelasi `tata2`
  82.     for (int i = 1; i <= nr; ++i) {
  83.         if (i == tata) continue; // sarim tatal nodului (trebuie sa-i afisam fratii)
  84.         if (vec[i] == tata2) cout << i << ' ';
  85.     }
  86.     cout << endl;
  87. }
  88.  
  89.  
  90. void f24()
  91. {
  92.     cout << "Afisez fratii unui nod precizat.\n";
  93.     cout << "Nod: ";
  94.     int node;
  95.     cin >> node;
  96.     cout << "Frati: ";
  97.     int tata = vec[node];
  98.     // afisam toate celelalte noduri ce au acelasi tata
  99.     for (int i = 1; i <= nr; ++i) {
  100.         if (i == node) continue; // sarim nodul curent
  101.         // daca tatal lui i este chiar `tata` atunci nodul este un frate al lui `node`
  102.         if (vec[i] == tata) cout << i << ' ';
  103.     }
  104.     cout << endl;
  105. }
  106.  
  107.  
  108. int main()
  109. {
  110.     // citire
  111.     cout << "Numar elemente: ";
  112.     cin >> nr;
  113.     cout << "Elemente: ";
  114.     for (int i = 1; i <= nr; ++i) cin >> vec[i];
  115.     // rezolvam pe rand toate cele 4 probleme
  116.     f26();
  117.     f27();
  118.     f30();
  119.     f24();
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement