Pagina informaticii

Teste de informatică pentru liceu, articole C#, C/C++, PHP

Metoda backtracking in generarea permutarilor

1. Să se genereze toate numerele de n cifre care nu conţin 3 numere alăturate identice.

2. Se citesc n şi k. Să se genereze toate permutările de mulţimii {1, 2…, n} care conţin exact k secvenţe crescătoare. De exemplu, pentru n=3 şi k=2, permutările sunt:
1 3 2
2 1 3
2 3 1
3 1 2

3. Se citesc numerele naturale n şi S. Să se determine, dacă există, o permutare p=(p1,p2,...pn) a mulţimii {1, 2…, n} astfel încât 1*p1 + 2*p2 + ... + n*pn = S.

4. Se citesc n, p, q. Să se genereze toate permutările mulţimii {1, 2…, n} care conţin exact p numere vizibile din stânga şi exact q numere vizibile din dreapta. Spunem că un număr este vizibil din stânga, dacă toate numerele din stânga sa sunt mai mici decât el. De exemplu, permutarea 3 1 5 4 2 are două numere vizibile din stânga şi trei din dreapta.

Despre autor
Author

Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică

Comentarii (2)
  • Avatar

    Neagu 11-10-2012 14:21:1

    Puteti sa ne spuneti cum se rezolva in C++?

  • Avatar

    Dan P. 12-10-2012 16:30:15

    Aici ai generarea permutărilor. Problemele din test sunt legate de aceasta.



    #include<iostream>

    using namespace std;

    int a[20], n, viz[20];

    void PrintSol()

    {

    int i;

    for (i = 1; i <= n; i++)

    cout << a[i] << " ";

    cout << "\n";

    }

    void Back(int top)

    {

    int i;

    if (top == n + 1) PrintSol();

    else for (i = 1; i <=n; i++)

    if (!viz[i])

    {

    viz[i] = 1;

    a[top] = i;

    Back(top + 1);

    viz[i] = 0;

    }

    }

    int main()

    {

    cout << "n = ";

    cin >> n;

    Back(1);

    return 0 ;

    }

Scrie un comentariu
Nume:

Comentariu:

15 + 10 =