Labyrith Rekursive Wegsuche

siser

Mitglied
hallo,

ich möchte eine Methode findeWeg programieren die mir in einem Labyrinth was zb so aussieht den Weg findet :
XXXXXXXXXX
X X
X XXX X XX
X X X X
XXX X XX X
X XXX X
XXX XX X
s X xXX X
X X XX
XXXXXXXzXX

ich möchte von s nach z

Die Methode funktiniert in soweit das sie den weg berechnet, der auch korrekt ist aber dann löscht sie ihn wieder und gibt am ende immer nur null zurück. Das soll sie aber nur wenns keinen weg gibt

r und s sind die Indexe des labyrinth arrays

[Java]static String findeWeg(char[][] lab, int r, int s, String weg) {
//null oder weg
if(lab[r]=='z'){
System.out.println("Weg :"+weg); //<--- da ist zwischendruch das richtige ergebnis was auch ausgegeben wird aber die methode liefert den falschen weg am ende zurück
return weg;}
else{

if(istSchrittOk(lab, r, s-1, weg, 'l'))
findeWeg(lab,r,s-1,weg+"l");
if(istSchrittOk(lab, r, s+1, weg, 'r'))
findeWeg(lab,r,s+1,weg+"r");
if(istSchrittOk(lab, r+1, s, weg, 'u'))
findeWeg(lab,r+1,s,weg+"u");
if(istSchrittOk(lab, r-1, s, weg, 'o'))
findeWeg(lab,r-1,s,weg+"o");

return null;
}[/Java]

was ist da falsch? ist bestimmt nur ne Kleinigkeit da er ja den Weg findet aber dann wieder sukzessive löscht
 
Es sollte wohl eher so aussehen:
[JAVA=8]
String tmp;
if(istSchrittOk(lab, r, s-1, weg, 'l')) {
tmp = findeWeg(lab,r,s-1,weg+"l");
if (tmp!=null) {
return tmp;
}
} else if(istSchrittOk(lab, r, s+1, weg, 'r')) {
tmp = findeWeg(lab,r,s+1,weg+"r");
if (tmp!=null) {
return tmp;
}
} else if ....
}
return null;
}
[/code]
 
Es könnte auch ausreichen, vor jedem "findeWeg"-Aufruf return zu schreiben.
Sprich:
Java:
...
   if(istSchrittOk(lab, r, s-1, weg, 'l'))
    return findeWeg(lab,r,s-1,weg+"l");
   if(istSchrittOk(lab, r, s+1, weg, 'r'))
    return findeWeg(lab,r,s+1,weg+"r");
   if(istSchrittOk(lab, r+1, s, weg, 'u'))
    return findeWeg(lab,r+1,s,weg+"u");
   if(istSchrittOk(lab, r-1, s, weg, 'o'))
    return findeWeg(lab,r-1,s,weg+"o");
...
 
@darekkay vor allem return zu setzen bringt leider nichts. das hatte ich vorher schonmal ausprobiert. wenn ich das so mache probiert er erst gar nicht alle Möglichkeiten druch

Selbiges gilt wen ich else if nehme. Dann probiert er auch nicht alls durch. Meine Abbruchbedingung soll ja sein das in den Feld ein z steht. Das muss also da noch drin sein.


Wenn ich den String tmp global definiere und noch eine boolean Variabel gefunden(b) gehts zwar auch aber das ist doch sehr unschön

Java:
static String findeWeg(char[][] lab, int r, int s, String weg) {
    //null oder weg

  if(lab[r][s]=='z'){

tmp=weg;
b=true;
return weg;
}else{


   if(istSchrittOk(lab, r, s-1, weg, 'l'))
   findeWeg(lab,r,s-1,weg+"l");
   if(istSchrittOk(lab, r, s+1, weg, 'r'))
   findeWeg(lab,r,s+1,weg+"r");
   if(istSchrittOk(lab, r+1, s, weg, 'u'))
    findeWeg(lab,r+1,s,weg+"u");
   if(istSchrittOk(lab, r-1, s, weg, 'o'))
     findeWeg(lab,r-1,s,weg+"o");
   if(b){
    return tmp;
    }
    else{
 return null;}
}


@XHelp Trotzdem liefer mir die Methode null zurück. ob ich das abprüfe oder nicht
 
Zuletzt bearbeitet:
Der Knackpunkt war nicht else if, sondern die Prüfung auf null.
Wenn da null irgendwo zurückgekommen ist, dann musst du weiter suchen, ansonsten kannst du den Weg gleich zurückgeben.
 

Zurück
Oben