Backtracking - labirintus

Adott egy labirintus térképe (m x n-es mátrix, melyben 0 értékek jelölik a folyosókat, 1-esek pedig a falakat), továbbá egy induló és egy célpozíció. Generáljuk le az összes lehetséges utat!

  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
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream>
#include <fstream>
using namespace std;

ifstream bemenet("input.txt");
ofstream kimenet("output.txt");

void f(
    int poz_i, int poz_j,
    int cel_i, int cel_j,
    int m, int n, int labirintus[100][100])
{
    if (poz_i == cel_i && poz_j == cel_j) {

        kimenet << endl << "-------------------" << endl << endl;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++)
                if (labirintus[i][j] == -1) {
                    kimenet << "# ";
                }
                else
                    kimenet << labirintus[i][j] << " ";
            kimenet << endl;
        }
    }
    else {
        int uj_i, uj_j;

        // balra
        uj_i = poz_i;
        uj_j = poz_j-1;

        if (uj_i >= 0 && uj_i < m && uj_j >= 0 && uj_j < n
            && labirintus[uj_i][uj_j] == 0)
        {
            labirintus[uj_i][uj_j] = 1 + labirintus[poz_i][poz_j];
            f(uj_i, uj_j, cel_i, cel_j, m, n, labirintus);
            labirintus[uj_i][uj_j] = 0;
        }

        // jobbra
        uj_i = poz_i;
        uj_j = poz_j+1;

        if (uj_i >= 0 && uj_i < m && uj_j >= 0 && uj_j < n
            && labirintus[uj_i][uj_j] == 0)
        {
            labirintus[uj_i][uj_j] = 1 + labirintus[poz_i][poz_j];
            f(uj_i, uj_j, cel_i, cel_j, m, n, labirintus);
            labirintus[uj_i][uj_j] = 0;
        }

        // fel
        uj_i = poz_i-1;
        uj_j = poz_j;

        if (uj_i >= 0 && uj_i < m && uj_j >= 0 && uj_j < n
            && labirintus[uj_i][uj_j] == 0)
        {
            labirintus[uj_i][uj_j] = 1 + labirintus[poz_i][poz_j];
            f(uj_i, uj_j, cel_i, cel_j, m, n, labirintus);
            labirintus[uj_i][uj_j] = 0;
        }

        // le
        uj_i = poz_i+1;
        uj_j = poz_j;

        if (uj_i >= 0 && uj_i < m && uj_j >= 0 && uj_j < n
            && labirintus[uj_i][uj_j] == 0)
        {
            labirintus[uj_i][uj_j] = 1 + labirintus[poz_i][poz_j];
            f(uj_i, uj_j, cel_i, cel_j, m, n, labirintus);
            labirintus[uj_i][uj_j] = 0;
        }
    }
}

int main()
{

    int m, n;  // m x n-es mátrix
    int labirintus[100][100];

    bemenet >> m >> n;
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++) {
            int szam;
            bemenet >> szam;
            if (szam == 1)
                szam = -1;

            labirintus[i][j] = szam;
        }

    int start_i, start_j;
    int cel_i, cel_j;

    bemenet >> start_i >> start_j;
    bemenet >> cel_i >> cel_j;

    start_i--;
    start_j--;
    cel_i--;
    cel_j--;

    labirintus[start_i][start_j] = 1;

    f(start_i, start_j, cel_i, cel_j, m, n, labirintus);

    return 0;
}

Példa

Bemenet:

8 6
1 1 1 1 1 1
1 0 0 0 0 1
1 0 1 1 0 1
1 0 0 0 0 1
1 0 0 1 0 1
1 1 0 1 0 1
1 1 0 0 0 1
1 1 1 1 1 1

2 2
7 5

Kimenet:

-------------------

# # # # # # 
# 1 2 3 4 # 
# 0 # # 5 # 
# 9 8 7 6 # 
# 10 11 # 0 # 
# # 12 # 0 # 
# # 13 14 15 # 
# # # # # # 

-------------------

# # # # # # 
# 1 2 3 4 # 
# 0 # # 5 # 
# 0 8 7 6 # 
# 0 9 # 0 # 
# # 10 # 0 # 
# # 11 12 13 # 
# # # # # # 

-------------------

# # # # # # 
# 1 2 3 4 # 
# 0 # # 5 # 
# 0 0 0 6 # 
# 0 0 # 7 # 
# # 0 # 8 # 
# # 0 0 9 # 
# # # # # # 

-------------------

# # # # # # 
# 1 0 0 0 # 
# 2 # # 0 # 
# 3 4 5 6 # 
# 0 0 # 7 # 
# # 0 # 8 # 
# # 0 0 9 # 
# # # # # # 

-------------------

# # # # # # 
# 1 0 0 0 # 
# 2 # # 0 # 
# 3 4 0 0 # 
# 0 5 # 0 # 
# # 6 # 0 # 
# # 7 8 9 # 
# # # # # # 

-------------------

# # # # # # 
# 1 0 0 0 # 
# 2 # # 0 # 
# 3 6 7 8 # 
# 4 5 # 9 # 
# # 0 # 10 # 
# # 0 0 11 # 
# # # # # # 

-------------------

# # # # # # 
# 1 0 0 0 # 
# 2 # # 0 # 
# 3 0 0 0 # 
# 4 5 # 0 # 
# # 6 # 0 # 
# # 7 8 9 # 
# # # # # #