Labyrinth - Weg mit x füllen aber x verschwindet



  • m[r][c] = ' ';

    ist die letzte Anweisung vor dem return. Damit ersetzt Du sie durch ein leerzeichen.



  • okay... danke 🙂

    Hm... könntest du mir vielleicht noch bei der Errechnung der Ausgänge helfen? 😞

    Ich wollte es so lösen, dass halt beim auftreten auf einen Punkt sum hochgezählt wird.

    Leider scheint das absolut nicht so zu funktionieren, wie ich es möchte 😕

    void mazeTraverse( char m[][14], int r, int c )
    {
    	static int update = time( 0 ) % 10;
    	int sum=0;
    
    	while ( time(0) % 10 != update )
    		;	// wait
    
    	if ( time( 0 ) % 10 == 9 )
    		update = 0;
    	else
    		update = (time( 0 ) % 10) + 1;
    
    	m[r][c] = 'x';	// mark spot visited
    
    	system("cls");
    
    	// print the maze
    	for ( int row = 0; row < 14; row++ )
    	{
    		for ( int column = 0; column < 14; column++ )
    			cout << m[row][column];
    
    		cout << '\n';
    	}
    
    	if ( m[r][c] == 'E' )
    	{
    		cout << "\nsuccess!\n";
    		return;
    	}
    	else
    	{
    		if ( m[r-1][c] == ' ' || m[r-1][c] == 'E' )	// if can go up
    			mazeTraverse( m, r-1, c );	// start going up
    
    		if ( m[r+1][c] == ' ' || m[r+1][c] == 'E' )	// if can go down
    			mazeTraverse( m, r+1, c );	// start going down
    
    		if ( m[r][c-1] == ' ' || m[r][c-1] == 'E' )	// if can go left
    			mazeTraverse( m, r, c-1 );	// start going left
    
    		if ( m[r][c+1] == ' ' || m[r][c+1] == 'E' )	// if can go right
    			mazeTraverse( m, r, c+1 );	// start going right
    
    		if ( m[r][c+1] == '.')
    
    		    sum++;
    		cout << "Es gibt " << sum << "Ausgaenge";
    
    		return;
    	}
    


  • Das funktioniert so nicht, weil Du sum ja erst in der Funktion anlegst, jeder rekursive Aufruf hat seine eigene Variable. Du kannst die Variable entweder global anlegen, oder per Referenz mit an die Funktion übergeben.



  • Ah .. -.- ^^

    Hm.. seltsamerweise zählt er mir nun aber nur einen "Ausgang", obwohl das x zu beiden hinläuft.

    #include <iostream>
    #include <ctime>
    
    using std::cout;
    
    int sum=0;
    
    void mazeTraverse( char [][14], int, int );
    
    int main()
    {
    	char maze[14][14] = 
    	{
    	{ '.','.','.','.','.','.','.','.','.','.','.','.','.','.' },
    	{ '.','#','#','#','#','#','#','#','#','#','#','#','#','.' },
    	{ '.','#',' ',' ',' ','#',' ',' ',' ',' ',' ',' ','#','.' },
    	{ '.',' ',' ','#',' ','#',' ','#','#','#','#',' ','#','.' },
    	{ '.','#','#','#',' ','#',' ',' ',' ',' ','#',' ','#','.' },
    	{ '.','#',' ',' ',' ',' ','#','#','#',' ','#',' ',' ','.' },
    	{ '.','#','#','#','#',' ','#',' ','#',' ','#',' ','#','.' },
    	{ '.','#',' ',' ','#',' ','#',' ','#',' ','#',' ','#','.' },
    	{ '.','#','#',' ','#',' ','#',' ','#',' ','#',' ','#','.' },
    	{ '.','#',' ',' ',' ',' ',' ',' ',' ',' ','#',' ','#','.' },
    	{ '.','#','#','#','#','#','#',' ','#','#','#',' ','#','.' },
    	{ '.','#',' ',' ',' ',' ',' ',' ','#',' ',' ',' ','#','.' },
    	{ '.','#','#','#','#','#','#','#','#',' ','#','#','#','.' },
    	{ '.','.','.','.','.','.','.','.','.','.','.','.','.','.' }
    	};
    
    	mazeTraverse( maze, 3, 1 );
    
    	cout << "Es gibt " << sum << "Ausgaenge";
    
    	system("pause");
    
    	return 0;
    
    }	// end main
    
    void mazeTraverse( char m[][14], int r, int c )
    {
    	static int update = time( 0 ) % 10;
    
    	while ( time(0) % 10 != update )
    		;	// wait
    
    	if ( time( 0 ) % 10 == 9 )
    		update = 0;
    	else
    		update = (time( 0 ) % 10) + 1;
    
    	m[r][c] = 'x';	// mark spot visited
    
    	system("cls");
    
    	// print the maze
    	for ( int row = 0; row < 14; row++ )
    	{
    		for ( int column = 0; column < 14; column++ )
    			cout << m[row][column];
    
    		cout << '\n';
    	}
    
    	if ( m[r][c] == 'E' )
    	{
    		cout << "\nsuccess!\n";
    		return;
    	}
    	else
    	{
    		if ( m[r-1][c] == ' ' || m[r-1][c] == 'E' )	// if can go up
    			mazeTraverse( m, r-1, c );	// start going up
    
    		if ( m[r+1][c] == ' ' || m[r+1][c] == 'E' )	// if can go down
    			mazeTraverse( m, r+1, c );	// start going down
    
    		if ( m[r][c-1] == ' ' || m[r][c-1] == 'E' )	// if can go left
    			mazeTraverse( m, r, c-1 );	// start going left
    
    		if ( m[r][c+1] == ' ' || m[r][c+1] == 'E' )	// if can go right
    			mazeTraverse( m, r, c+1 );	// start going right
    
    		if ( m[r][c+1] == '.')
    
    		    sum++;
    
    		return;
    	}
    
    }	// end function mazeTraverse
    

    Die ausgabe sagt es gibt einen Ausgang, es müssten aber zwei sein, weil das x an zwei stellen auf einen Punkt treffen kann (und eigentlich auch müsste zumindestens werden alle wege "vom x beschritten")



  • Die Abfrage vor dem sum++ sieht komisch aus. Du fragst damit ja das Feld nebendran ab oder so. Eventuell solltest Du das überarbeiten?



  • Hm.. wenn ich sie mit den anderen "glichsetze" /halt weiterhin ein . anstatt ein Leerzeichen) kommt weiterhin das gleiche raus und mir gehen die Ideen aus.

    Die abfrage muss doch sein, wenn er auf nen Puntk trifft dann zähle Summe hoch und er müsste zweimal auf einen Puntk treffen -.- Ich verstehs nicht 😞



  • hmm du prüfst aber auch nur ob sich rechts ein Punkt befindet.
    Solltest du die drei anderen Richtungen nicht auch prüfen?



  • Okay... gibt es noch eine Möglichkeit, den eingang nicht mitzählen zu löassen, ausser keine Überprüfung Links durchzuführen? wahrscheinlich nicht, oder?



  • Was wäre wenn Du Eingänge und Ausgänge mit verschiedenen Symbolen kennzeichnest?



  • Würde ich ja gerne, aber die aufgabenstellung lautet numal genau so 😉

    P.S. Wie könnte ich denn den Ausgängen ihre "laufende Nummer" zuordnen und ausgeben? So etwas hab ich noch nie gemacht und auch nicht in "C++ lernen und professionell anwenden" von Prinz gefunden? o.O


Anmelden zum Antworten