Backtracking

Backtracking (visszalépéses keresés)

Feladatmegoldási módszer, leggyakrabban kombinatorikai elemek generálására vagy ezek közötti keresésre használjuk.

Bevezető feladatok

1. Írjuk ki az összes kétjegyű számot, amit az {1,2,3,4} számjegyekből alkothatunk (ismétlődhetnek is)!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <iostream>
using namespace std;

int main()
{
    for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= 4; j++) {
            cout << i << j << endl;
            // cout << i*10 + j << endl;
        }
    }

    return 0;
}

2. Írjuk ki az összes háromjegyű számot, amit az {1,2,3,4} számjegyekből alkothatunk (ismétlődhetnek is)!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <iostream>
using namespace std;

int main()
{
    for (int i = 1; i <= 4; i++)
        for (int j = 1; j <= 4; j++)
            for (int k = 1; k <= 4; k++)
                cout << i << j << k << endl;

    return 0;
}

3. Adott k esetén (bemenet) írjuk ki az összes k-jegyű számot, amit az {1,2,3,4} számjegyekből alkothatunk (ismétlődhetnek is)!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;

void f(int szint, int k, int megoldas[])
{
    if (szint > k) {
        for (int i = 0; i < k; i++)
            cout << megoldas[i];
        cout << endl;
    }
    else {
        for (int i = 1; i <= 4; i++) {
            megoldas[szint-1] = i;
            f(szint+1, k, megoldas);
        }
    }
}

int main()
{
    int k;
    cin >> k;
    cout << "-----------" << endl;

    int megoldas[100];

    f(1, k, megoldas);

    return 0;
}