Cod sursa(job #1467707)

Utilizator mihaiadelinamihai adelina mihaiadelina Data 3 august 2015 23:32:08
Problema Generare de permutari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <fstream>
using namespace std;

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

int n, v[10];

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

bool valid (int k) {
    for (int i = 1; i <= k - 1; i++) {      // comparam fiecare element din vectorul v cu ultimul element selectat
        if (v[i] == v[k]) {                 //deoarece într-o permutare elementele nu au voie să se repete,
            return false;                   //returnăm 0 în cazul în care elementul selectat, a mai fost selectat o dată
        }
    }
    return true;                            //returnăm 1 în cazul în care elementul nu mai apare în vector
}

/* b(1) [1]
   b(1) -> b(2) [1, 1]
   b(1) -> b(2) [1, 2]
   b(1) -> b(2) -> b(3) [1, 2, 1]
   b(1) -> b(2) -> b(3) [1, 2, 2]
   b(1) -> b(2) -> b(3) [1, 2, 3] ~ 1 2 3
   b(1) -> b(2) [1, 3]
   b(1) -> b(2) -> b(3) [1, 3, 1]
   b(1) -> b(2) -> b(3) [1, 3, 2] ~ 1 3 2
   b(1) -> b(2) -> b(3) [1, 3, 3]
   b(1) -> b(2)
   b(1) [2]
   b(1) -> b(2) [2, 1]
   b(1) -> b(2) -> b(3) [2, 1, 1]
   b(1) -> b(2) -> b(3) [2, 1, 2]
   b(1) -> b(2) -> b(3) [2, 1, 3] ~ 2 1 3
   b(1) -> b(2) [2, 2]
   b(1) -> b(2) [2, 3]
   b(1) -> b(2) -> b(3) [2, 3, 1] ~ 2 3 1
   b(1) -> b(2) -> b(3) [2, 3, 2]
   b(1) -> b(2) -> b(3) [2, 3, 3]
   b(1) -> b(2)
   b(1) [3]
   b(1) -> b(2) [3, 1]
   b(1) -> b(2) -> b(3) [3, 1, 1]
   b(1) -> b(2) -> b(3) [3, 1, 2] ~ 3 1 2
   b(1) -> b(2) -> b(3) [3, 1, 3]
   b(1) -> b(2) [3, 2]
   b(1) -> b(2) -> b(3) [3, 2, 1] ~ 3 2 1
   b(1) -> b(2) -> b(3) [3, 2, 2]
   b(1) -> b(2) -> b(3) [3, 2, 3]
   b(1) -> b(2) [3, 3]
   b(1)
*/


void backtracking (int k) {
    for (int i = 1; i <= n; i++) {         //parcurgem elementele mulţimii Sk
        v[k] = i;                          //selectăm un element din mulţimea Sk
        if (valid(k)) {                    //verificăm dacă eelementul ales îndeplineşte condiiile de continuare
            if (k == n) {                  //se afişează soluţia obţinută
                write();
            }
            else {
                backtracking(k + 1);                   //reapemăm funcţia pentru poziţia k+1 din vectorul v
            }
        }
    }
}

int main() {
    fin >> n;
    backtracking(1);
    return 0;
}