Labyrinth

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hi

    ich brauche mal eure Hilfe so richitg funktioniert mein Backtracking Algorithmus nicht. Was is falsch ?


    Quellcode

    1. class Labyrinth{
    2. final static int[] STEPX = { 0, 1, 0,-1 };
    3. final static int[] STEPY = { -1, 0, 1, 0 };
    4. static int schritt;
    5. final static int OBEN = 0, RECHTS = 1, UNTEN = 2, LINKS = 3;
    6. static int aktX;
    7. static int aktY;
    8. static char[][] labyrinth = {
    9. {' ','x','x','x','x'},
    10. {' ',' ',' ','x','x'},
    11. {'x','x',' ',' ',' '},
    12. {'x',' ',' ','x',' '},
    13. {'x','x','x','x',' '}};
    14. static boolean findeWeg(char[][] lab, int i, int j){
    15. int n = lab.length;
    16. schritt = -1;
    17. while (schritt != LINKS) {
    18. schritt ++;
    19. int neuX = i + STEPX[schritt];
    20. int neuY = j + STEPY[schritt];
    21. boolean ok = true;
    22. if (neuX < 0 || neuX >= n) ok = false;
    23. if (neuY < 0 || neuY >= n) ok = false;
    24. if (ok && lab[neuX][neuY] !=' ') ok = false;
    25. if(ok){
    26. lab[neuX][neuY] = '.';
    27. if (findeWeg(lab, neuX, neuY)) {
    28. return true;
    29. } else {
    30. return false;
    31. }
    32. }
    33. }//while
    34. lab[i][j]= ' ';
    35. return false;
    36. }//findeWeg
    37. public static void zeige(char[][]a){
    38. for (int i = 0; i < a.length; i++) {
    39. for (int j = 0; j < a.length; j++) {
    40. System.out.print(a[i][j]+ " ");
    41. }
    42. System.out.println();
    43. }
    44. }
    45. public static void main (String[] args){
    46. zeige(labyrinth);
    47. boolean b = findeWeg(labyrinth, 0, 0);
    48. if (b) System.out.println("Weg gefunden");
    49. else System.out.println("Keinen Weg gefunden");
    50. zeige(labyrinth);
    51. }
    52. }// Klassenende
    Alles anzeigen
  • so ich habe den ausgang rechts unten gesetzt als zwischenlösung nur die schritte
    zurück klappen nicht :(

    Quellcode

    1. class Labyrinth{
    2. final static int[] STEPX = { 0, 1, 0,-1 };
    3. final static int[] STEPY = { -1, 0, 1, 0 };
    4. static int schritt;
    5. final static int OBEN = 0, RECHTS = 1, UNTEN = 2, LINKS = 3;
    6. static int aktX;
    7. static int aktY;
    8. static char[][] labyrinth = {
    9. {' ','x','x','x','x'},
    10. {' ',' ',' ','x','x'},
    11. {'x','x',' ',' ',' '},
    12. {'x',' ',' ','x',' '},
    13. {'x','x','x','x',' '}};
    14. static boolean findeWeg(char[][] lab, int i, int j){
    15. int n = lab.length;
    16. schritt = -1;
    17. zeige(lab);
    18. System.out.println("----");
    19. while (schritt != LINKS) {
    20. schritt ++;
    21. int neuX = i + STEPX[schritt];
    22. int neuY = j + STEPY[schritt];
    23. boolean ok = true;
    24. if (neuX < 0 || neuX >= n) ok = false;
    25. if (neuY < 0 || neuY >= n) ok = false;
    26. if (ok && lab[neuX][neuY] !=' ') ok = false;
    27. if(ok){
    28. lab[neuX][neuY] = '.';
    29. if (!ausgangGefunden(neuX, neuY)) {
    30. // rekursiver Aufruf von FindeLoesung
    31. if (findeWeg(lab, neuX, neuY)) {
    32. // Lösung gefunden
    33. return true;
    34. } else {
    35. lab[neuX][neuY] = ' ';
    36. }
    37. } else return true;
    38. }
    39. }//while
    40. return false;
    41. }
    42. private static boolean ausgangGefunden(int neuX, int neuY) {
    43. if(neuX==4 && neuY==4){
    44. return true;
    45. }
    46. return false;
    47. }
    48. public static void zeige(char[][]a){
    49. for (int i = 0; i < a.length; i++) {
    50. for (int j = 0; j < a.length; j++) {
    51. System.out.print(a[i][j]+ " ");
    52. }
    53. System.out.println();
    54. }
    55. }
    56. public static void main (String[] args){
    57. zeige(labyrinth);
    58. boolean b = findeWeg(labyrinth, 0, 0);
    59. if (b) System.out.println("Weg gefunden");
    60. else System.out.println("Keinen Weg gefunden");
    61. zeige(labyrinth);
    62. }
    63. }// Klassenende
    Alles anzeigen
  • Hehe wenn ich dir jetzt sage woran es liegt, schlägst du wahrscheinlich die Hände überm Kopf zusammen. Also soweit stimmt alle.
    Fangen wir aber erst mal bei was anderem an.
    Ich nörgele so gerne an anderer Leuten Code rum.
    Du solltest umbedingt aufhören, alles als static zu deklarieren und richtige Klassen schreiben. Soll heißen: ne eigene Klasse Labyrinth, mit verschiedenen Methoden und eine Klasse "Client" die das ganze ausführt.
    Solltest dir erst gar nicht angewöhnen alles als static zu deklarieren und direkt aufzurufen !!!!

    So nun zu deinen "Kleinigkeit"
    Wenn du ein "int" vor "schritt = -1" schreibst funktioniert es ;)

    Quellcode

    1. static boolean findeWeg(char[][] lab, int i, int j){
    2. int n = lab.length;
    3. int schritt = -1;
    4. ...


    Du verwendest nur EINE Variable, anstatt für jeden rekursiven Aufruf eine eigene.

    mfg
    Ubuntu Edgy * Kernel 2.6.17 * Gnome 2.16 * Beryl
    2 x Athlon MP 1900 * MSI K7D Master-L * 1024 MB ECC DDR333
    Hercules 9800XT 256 MB Ram * 1x 250 GB IDE
    Wasserkühlung