Cod sursa(job #2402313)

Utilizator gabriel.crosmanCrosman Gabriel gabriel.crosman Data 10 aprilie 2019 16:33:55
Problema Generare de permutari Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>	
#include <iostream>
#include <vector>
#include <unordered_set>
	
using namespace std;

ofstream fout("permutari.out");

class Permutari {

public:

	void solve() {
	
		read_input();
		
		vector<int>  domeniu, solutie;
		domeniu.reserve(n);
		solutie.reserve(n);
		unordered_set<int> visited;
		k = 1;
		int i;
		for (i = 0; i < n; i++) {	
			domeniu.push_back(i + 1);
			
			if (i < k) {
				solutie.push_back(0);
			}
		}

		perm(0, k, domeniu, solutie, visited);
	
	}

private:

	int n, k;

	void read_input() {

		ifstream fin("permutari.in");
		fin >> n;
		fin.close();
	}

	void printSol(vector<int> &solutie) {

		for (int s : solutie) {

			fout << s << " ";
		}
		
		fout << endl;
	}

	void perm(int step, int &k, vector<int> &domeniu, vector<int> &solutie, unordered_set<int> &visited) {

		if (step == k || k == n) {
			k++;
			cout << k << endl;
			printSol(solutie);
			return;
		}

		unsigned int i;

		for (i = 0; i < domeniu.size(); i++) {
 
 			if (visited.find(domeniu[i]) == visited.end()) {

           	 	visited.insert(domeniu[i]);

            	solutie[step] = domeniu[i];
            	k++;
            	perm(step + 1, k, domeniu, solutie, visited);

            	k = 0;
            	visited.erase(domeniu[i]);
        	}
		}
	}
};

int main() {

	Permutari perms;

	perms.solve();

	fout.close();

	return 0;
}