Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » rekursives Problem ...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.05.2004, 20:43 Uhr
~mansonfreak
Gast


hi ...

also ich folgenden code ... wichtig ist eigentlich nur die methode mauszug ...

das programm spricht ja für sich wenn mans einmal laufen lässt ... nun will ich aber folgendes ...

wenn die maus den käse findet, soll die methode verlassen werden ... es wird aber aufgrund der rekursiven aufrufe immer noch weitergesucht ... ich habs mit bool variablen versucht ... haut aber nicht hin ... wie gehört der code abgeändert, damit er die methode verlässt ...

vielen Dank




C++:

/**************************************************************
Labyrinth: Eine Maus starten in Zelle 0/0 und soll den Kaese
in Zelle 4/4 finden. Beispiel fuer einen Backtracking-Algorithmus
**************************************************************/


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>



using std::cout;
using std::cin;
using std::cerr;
using std::endl;



#define n 5 // Labyrinthgröße
char feld[n][n]={   {' ',' ',' ','X',' '},
                    {' ',' ',' ',' ',' '},
                    {' ','X',' ','X',' '},
                    {' ','X',' ','X',' '},
                    {' ',' ','X','X','@'}};
// ' ' = Weg, 'X' = Mauer, '@' = Käse
char allesausgeben;

void ausgabe(char *text) {
    int i,j;
    printf("\n+");
    for (i=0; i<n;i++)
        printf("-");
    printf("+");
    for (i=0; i<n;i++) {
        printf("\n|");
        for (j=0; j<n; j++)
            printf("%c", feld[i][j]);
        printf("|");
    }
    printf("\n+");
    for (i=0; i<n;i++)
        printf("-");
    printf("+");
    printf("%s\n", text);
    getc(stdin); // evtl. auskommentieren!
}
void mauszug(int zeile, int spalte) {

bool test = true;


    if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n
    && feld[zeile][spalte] != 'X' && feld[zeile][spalte]!=':')
    { // Zug trifft Labyrinth und Feld ist noch frei

        if (feld[zeile][spalte] == '@') { // Käse gefunden!!!!!            feld[zeile][spalte] = '#'; // Käse fressen
            feld[zeile][spalte] = '#'; // Käse fressen
            ausgabe("Hmmm, leckerer Käse!");
            test = false;
            cout << "Test1" << endl;

        } // if
        else {feld[zeile][spalte]=':'; // Feld als besetzt markieren

            if (allesausgeben)
                ausgabe("");

            if (test == true)
              mauszug(zeile+1, spalte); // rekursive Aufrufe
            if (test == true)
              mauszug(zeile, spalte+1);
            if (test == true)
              mauszug(zeile-1, spalte);
            if (test == true)
              mauszug(zeile, spalte-1);

            if (allesausgeben)
                ausgabe("");
            feld[zeile][spalte]=' '; // Feld freigeben!!!
        } // else
    } // if
} // mauszug

int main() {
    char antwort[10];
    printf("Wollen Sie jeden mauszug ausgeben? ");
    scanf("%s",antwort);
    allesausgeben = antwort[0]=='J' || antwort[0]=='j';
    ausgabe("");
    mauszug(0, 0);

    cout << "Wieder zurück" << endl;

    return 0;
}



 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.05.2004, 08:38 Uhr
virtual
Sexiest Bit alive
(Operator)


Gib mauszug doch einen Rückgabewert, so ala:

C++:
[b]bool[/b] mauszug(int zeile, int spalte) {

bool test = true;


    if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n
    && feld[zeile][spalte] != 'X' && feld[zeile][spalte]!=':')
    { // Zug trifft Labyrinth und Feld ist noch frei

        if (feld[zeile][spalte] == '@') { // Käse gefunden!!!!!            feld[zeile][spalte] = '#'; // Käse fressen
            feld[zeile][spalte] = '#'; // Käse fressen
            ausgabe("Hmmm, leckerer Käse!");
            test = false;
            cout << "Test1" << endl;
            [b]return false;[/b]
        } // if
        else {feld[zeile][spalte]=':'; // Feld als besetzt markieren

            if (allesausgeben)
                ausgabe("");

            if (test == true)
              [b]if (!mauszug(zeile+1, spalte)) return true;[/b]
            if (test == true)
              mauszug(zeile, spalte+1);
              [b]if (!mauszug(zeile, spalte+1)) return true;[/b]
            if (test == true)
              [b]if (!mauszug(zeile-1, spalte)) return true;[/b]
            if (test == true)
              [b]if (!mauszug(zeile, spalte-1)) return true;[/b]

            if (allesausgeben)
                ausgabe("");
            feld[zeile][spalte]=' '; // Feld freigeben!!!
        } // else
    } // if
    [b]return true[/b]
} // mauszug


Ungetestet. Außerdem glaube ich, daß Du hier mit einer Schleife besser beraten wärst.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.05.2004, 09:48 Uhr
~mansonfreak
Gast


hi ...

danke erstmals ... ich habs jetzt so gelöst und es scheint zu funktionieren ...


C++:
/**************************************************************
Labyrinth: Eine Maus starten in Zelle 0/0 und soll den Kaese
in Zelle 4/4 finden. Beispiel fuer einen Backtracking-Algorithmus
**************************************************************/


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>



using std::cout;
using std::cin;
using std::cerr;
using std::endl;



#define n 5 // Labyrinthgröße
bool Ende = false;
char feld[n][n]={    
   {' ',' ',' ','X',' '},
   {' ',' ',' ',' ',' '},
   {' ','X',' ','X',' '},
   {' ','X',' ','X',' '},
   {' ',' ','X','X','@'}
};
// ' ' = Weg, 'X' = Mauer, '@' = Käse
char allesausgeben;

void ausgabe(char *text) {
   int i,j;
   printf("\n+");
   for (i=0; i<n;i++)
      printf("-");
   printf("+");
   for (i=0; i<n;i++) {
      printf("\n|");
      for (j=0; j<n; j++)
         printf("%c", feld[i][j]);
      printf("|");
   }
   printf("\n+");
   for (i=0; i<n;i++)
      printf("-");
   printf("+");
   printf("%s\n", text);
   getc(stdin); // evtl. auskommentieren!
}

void mauszug(int zeile, int spalte) {
      if ((zeile >= 0 && spalte >= 0 && zeile < n && spalte < n && feld[zeile][spalte] != 'X' && feld[zeile][spalte]!=':') && (Ende != true))
      { // Zug trifft Labyrinth und Feld ist noch frei
         if (feld[zeile][spalte] == '@') { // Käse gefunden!!!!!
            feld[zeile][spalte] = '#'; // Käse fressen
            ausgabe("Hmmm, leckerer Käse!");
            Ende = true;
         } // if
         else
         {    
            if (Ende != true) feld[zeile][spalte]=':'; // Feld als besetzt markieren
            if (Ende != true) if (allesausgeben) ausgabe("");
            mauszug(zeile+1, spalte); // rekursive Aufrufe
            mauszug(zeile, spalte+1);
            mauszug(zeile-1, spalte);
            mauszug(zeile, spalte-1);
            if (Ende != true) if (allesausgeben) ausgabe("");
            if (Ende != true) feld[zeile][spalte]=' '; // Feld freigeben!!!
         } // else
      } // if
} // mauszug

int main() {
   char antwort[10];
   printf("Wollen Sie jeden Mauszug ausgeben? ");
   scanf("%s",antwort);
   allesausgeben = antwort[0]=='J' || antwort[0]=='j';
   ausgabe("");
   mauszug(0, 0);
   return 0;
}




nun habe ich aber noch ein anderes problem ...

der weg vom start bis zum käse wird ja als ":" gekennzeichnet ... nun will ich aber folgende zeichen zum kennzeichnen des weges verwenden ...
> für rechts
v für unten
< für links
^ für oben ...

ein feld soll immer auf das nächste anschließende feld zeigen ...

es soll also folgendermaßen aussehen ...

ooSooo
xo>vxo
ooovoo
oov<oo
ooZooo

kann mir vielleicht jemand helfen das ganze in meinen code zu implementieren ...

lg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: