# Labyrinth



## gfp4ever (18. Jul 2022)

Hallo zusammen,
ich müsste den Weg aus einen Labyrinth rausfinden und markieren. Klar, Rekursion ist das Thema. Nach viel hin und her habe ich mich für ein Switch-Case entschieden (das hat sich so ergeben...) mit dem Cases oben, unten, rechts, links. 
Mein Problem ist das wenn ich das Labyrinth da durchlaufen lasse, bekomme ich den Fehler "index out of bounds", was ich nicht wirklich nachvollziehen kann weil der Index worum es geht liegt mittig im Labyrinth. Hätte da jemand zeit und Lust mir zu helfen?
Danke in voraus.


----------



## fhoffmann (18. Jul 2022)

Möglicherweise gehst du in deinem Labyrinth immer im Kreis. Du merkst dir also nicht, ob du an der Stelle, an der du bist, früher schon einmal warst.
Aber ohne deinen Code zu sehen, kann ich hier nur raten.


----------



## gfp4ever (18. Jul 2022)

Der code sieht so aus...
Die Idee war beginnen nach oben und dann in Uhrzeigersinn prüfen ob der Weg frei ist, wenn ja, weiter machen, wen nicht, dann in Uhrzeigersinn weiter prüfen. Aber vielleicht bin ich wirklich in kreis gelaufen...


```
public static boolean labSolveSwitch(char[][] lab, int x, int y, int n) {
        boolean ok = false;
        for (int i = 0; i < 4 && !ok; i++)
            if (i !=n) {
                switch (i) {
                case 0:
                    if (lab[y-1][x] == ' ')
                        ok = labSolveSwitch (lab, x, y-2, 2);
                    break;
                case 1:
                    if (lab[y][x+1] == ' ')
                        ok = labSolveSwitch (lab, x + 2, y, 3);
                    break;
                case 2:
                    if (lab[y+1][x] == ' ')
                        ok = labSolveSwitch (lab, x, y + 2, 0);
                    break;
                case 3:
                    if (lab[y][x-1] == ' ')
                        ok = labSolveSwitch (lab, x - 2, y, 1);
                    break;
                }       
                if (x == 0 && y == 0 && x >= lab.length && y >= lab.length) {
                    ok = true;
                    }           
                if (ok) {
                    lab[x][y] = '*';
                    switch (n) {
                    case 0:
                        lab[y-1][x] = '*';
                        break;
                    case 1:
                        lab[y][x+1] = '*';
                        break;
                    case 2:
                        lab[y+1][x] = '*';
                        break;
                    case 3:
                        lab[y][x-1] = '*';
                        break;
                        }
                    }
                }
        return ok;
    }
```


----------



## Jw456 (18. Jul 2022)

Hallo wie wäre es mit dem Pledge-Algorithmus


			http://www.inf.fu-berlin.de/lehre/SS17/PSThInf/notes/06_pledge.pdf


----------



## Jw456 (18. Jul 2022)

Du merkst dir den Weg ja erst wenn du aus der Rekursion zurückkommst .
Und das auch nur wenn das erfüllt ist.


> if (x == 0 && y == 0 && x >= lab.length && y >= lab.length) {
> ok = true;
> }


Das if  wird nie true sein.



Gehst ja bei jeden erneuten Aufruf erst mal nach oben.

Welches Zeichen stellt eine Wand dar in deinem Labyrinth dar?
" " ist ein leerraum
"*" ist dein gegangener Weg


----------



## Jw456 (18. Jul 2022)

> prüfen ob der Weg frei ist, wenn ja, weiter machen, wen nicht, dann in Uhrzeigersinn weiter prüfen.


genau das machst du nicht.


----------



## Jw456 (19. Jul 2022)

Auch das macht keinen Sinn. 

```
case 0: if (lab[y-1][x] == ' ') ok = labSolveSwitch (lab, x, y-2, 2); break;
```
Du prüft zb bei nach oben ob über dir frei ist. Aber gehst dann zwei Schritte nach oben. Wo du garnicht geprüft hast.  Dort könnte ja schon eine Mauer sein. 
Das ist bei den anderen  Richtungen das gleiche.


----------



## gfp4ever (19. Jul 2022)

Hallo zusammen, vielen Dank für die feedbacks... ich habe am Ende doch alles neu gemacht. Mit dem Switch-Case waren zu viele verschachtelte ifs und cases das ich da den überblick verloren habe und sinnlose codes geschrieben habe (Danke Jw456 !).


----------



## yfons123 (19. Jul 2022)

strings mot equals vergleichen und nicht mit ==


----------

