Temp isa: Difference between revisions

From Algopedia
Jump to navigationJump to search
No edit summary
 
(No difference)

Latest revision as of 10:20, 2 October 2018

Permutari varianta recursiva

#include <fstream>

using namespace std;

int n, st[16];
char folosit[16];

ifstream fin("permutari.in");
ofstream fout("permutari.out");

void tipar(){
  for(int i = 1 ; i <= n ; i++)
    fout << st[i] << " ";
  fout << "\n";
}

void back( int k ){
  if(k == n + 1)     			// daca am completat stiva pana la nivelul n
      tipar();		 		// tiparim solutie
  else					// daca nu am completat solutia
    for(int i=1 ; i<=n ; i++)	        // pun pe rand pe nivelul curent toate numerele de la 1 la n
      if(!folosit[i]){			// daca val nu a fost folosita
        folosit[i] = 1;			// o marchez ca folosita in vectorul de frecvente
        st[k] = i;			// pun valoarea pe stiva
        back(k+1);			// trec pe nivelul urmator 
        folosit[i] = 0;			// la reintoarcere din apelul recursiv, marchez ca nefolosita valoarea 
      }
}

int main(){
  fin >> n;   		
  back(1);			         //pornesc construirea solutiei de la nivelul 1
  return 0;
}

Optimizare cu liste - punem valori dintr-o lista cu numere inca nefolosite

// Solutie pusa de Cella, a lui Cata?
#include <iostream>

using namespace std;
const int MAXN = 10;

int lst[MAXN], v[MAXN], list_len;

inline void delete_from_list(int pos) {
  lst[pos] = lst[--list_len];
}

void add_to_list(int pos, int valoare) {
  lst[list_len++] = lst[pos];
  lst[pos] = valoare;
}

void generate_perm(int pos, int n) {
    if (pos == n) {
      for (int i = 0; i < n; ++i)
        cout << v[i] << " ";
      cout << '\n';
      return;
    }
    for (int i = 0; i < list_len; ++i) {
      v[pos] = lst[i];
      delete_from_list(i);
      generate_perm(pos + 1, n);
      add_to_list(i, v[pos]);
    }
}
int main(){
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i)
      lst[i] = i + 1;
    list_len = n;
    generate_perm(0, n);
    return 0;
}

Aranjamente varianta recursiva

#include <fstream>

using namespace std;

int n, p, st[16];
char folosit[16];

ifstream fin("aranjamente.in");
ofstream fout("aranjamente.out");

void tipar(){
  for(int i = 1 ; i <= p ; i++)
    fout << st[i] << " ";
  fout << "\n";
}

void back( int k ){
  if(k == p + 1)              // daca am completat stiva pana la nivelul n
      tipar();                // tiparim solutie
  else                        // daca nu am completat solutia
    for(int i=1 ; i<=n ; i++) // pun pe rand pe nivelul curent toate numerele de la 1 la n
      if(!folosit[i]){        // daca val nu a fost folosita
        folosit[i] = 1;       // o marchez ca folosita in vectorul de frecvente
        st[k] = i;            // pun valoarea pe stiva
        back(k+1);            // reapelez functia pentru completarea nivelului urmator al solutiei
        folosit[i] = 0;       // inainte sa iau alta valoare pe nivelul curent, specific ca i nu mai e folosita
      }
}

int main(){
  fin >> n >> p;
  back(1);                    // pornesc construirea solutiei de la nivelul 1
  return 0;
}