Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Backtracking

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
28.05.2007, 21:06 Uhr
~ritter
Gast


Moin!
Ich habe eine Aufgabe die wie folgt aussieht!

Die Voraussetzungen sieht wie folgt aus:

Ich habe folgende baumartige Struktur:

C++:
typedef struct {
    int left, right;
} pair;


    pair paare[] = {
        {1, 2}, {3, 4}, {5, 6}, {-1, 7},
        {8, 9}, {10, 11}, {12,-1}, {-1,-1},
        {13, 14}, {-1,-1}, {-1,-1}, {-1,-1},
        {-1,-1}, {15, 16}, {-1,-1}, {-1,-1}, {-2,-2}
    };



1. Der Baum ist von 0 bis n-1 durchnummeriert.
2. Knoten, die keinen linken bzw. rechten Sohn besitzen, haben stattdessen den Wert -1
3. Die Wurzel hat den Wert 0
4. Der Ausgänge besitzen den Wert -2

Ich soll jetzt beginnend vom Eingang (0) einen Ausgang mittels Backtracking finden.
Ich habe versucht den "Baum" zu zeichnen:
BAUM
(Keine Gewähr, dass er richtig ist)

Mein Code sieht wie folgt dazu aus:

C++:
#include<stdio.h>

typedef struct {
    int lnode, rnode;
} node_t;

node_t tree[] = {
    {1, 2}, {3, 4}, {5, 6}, {-1, 7},
    {8, 9}, {10, 11}, {12,-1}, {-1,-1},
    {13, 14}, {-1,-1}, {-1,-1}, {-1,-1},
    {-1,-1}, {15, 16}, {-1,-1}, {-1,-1}, {-2,-2}
};


int SearchExit (node_t *T, int node_no)
{
    static int x=1;
    if(T[node_no].lnode==-2 || T[node_no].rnode==-2)
    {
        if(T[node_no].lnode==-2)
            printf("Ausgang beim linken Kind von Knoten %d gefunden\n",node_no);
        if(T[node_no].rnode==-2)
            printf("Ausgang beim rechten Kind von Knoten %d gefunden\n",node_no);
        return 1;
    }
    
    
    if(T[node_no].lnode!=-2){
        if(SearchExit(T,(node_no+1))==1){
            printf("%2d. Knoten: %d | LINKS\n",x++,node_no);
            return 1;
        }
        
    }                
    
    if(T[node_no].rnode!=-2){        
        if(SearchExit(T,(node_no+1))==1){
            printf("%2d. Knoten: %d | RECHTS\n",x++,node_no);
            return 1;
        }
        
    }
        
    return 0;    
}

int main ( void )
{    


    if ( SearchExit(tree, 0)  == 1 )
        printf("Ausgang gefunden!\n");
    else
        printf("Ausgang nicht gefunden!\n");


    return 0;
}{


Nun hab eich ein problem!
Er findet zwar den Ausgang, aber irgendwie scheint er immer nur die erste bedingung anzuwählen! Er geht gar nicht in die zweite Bedingung für den rechten Knoten rein!!
Und er durckt jeden JEDEN knoten aus! Dass das Programm jeden Knoten durchgeht, ist mir klar, aber soll nur den richtigen Weg ausdrucken!

Kann mir mal jemand helfen?
ich komme einfach nicht weiter!

gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.05.2007, 18:48 Uhr
countless



Dein Programm ist soweit schon nicht ganz falsch, allerdings solltest du 2 Dinge noch einmal überdenken:
1. Mit das Wichtigste bei einer Rekursion ist die Abbruchbedingung, dh. wann soll die Rekursion stoppen. Bei dir gibt es da eigentlich mehr als einen Fall, aber nur einer (nämlich "Ausgang gefunden") ist explizit implementiert.
2. Der Grund warum das Programm nicht das macht, was du erwartest, liegt wahrscheinlich darin, dass du die Baumstruktur ignorierst.
Du läufst einfach nur die Liste der Knoten durch, wie sie in dem array stehen, aber um den richtigen Pfad zu finden, solltest du den Pfaden im Baum folgen.

Ich hoffe diese Denkanstöße helfen dir weiter - falls nicht, meld dich halt noch einmal. Als kleiner Anreiz: Als ich die entsprechenden Anregungen vornahm erhielt ich bis auf ein paar Kleinigkeiten den gesuchten Pfad :-)

bye countless
--
"I'm here..... yeah,.. I'm here.......... it's not that big of a deal.........
i won't have to return to that shitty world....
this is....... not that bad."
.hack//sign (tsukasa)
 
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: