Labirynt

0

Witam. Mam prośbę. Na zadanie dostałam napisać program, który znajdzie wyjście z labiryntu i ma to być algorytm rekurencyjny z powrotami. Czy mógłby mi ktoś powiedzieć, jak poprawić ten kod (co dopisać w funkcji "Droga")?

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int Droga (string plansza[], int wspIx, int wspIy)//,  /*int c, int e,  int ruchy[][2], int u, int i)
{
     int next;
    
    if(plansza[wspIx + 1][wspIy] == ' ' && next == 0)
    {
        plansza[wspIx + 1][wspIy] = 1;
        if(!Droga(plansza, wspIx+1, wspIy))
        {
            next = 0;
            plansza[wspIx+1][wspIy] = ' ';
        } 
        else 
        {
            Droga(plansza, wspIx+1, wspIy);
        }
    }
    else if(plansza[wspIx - 1][wspIy] == ' ' && next == 0)
    {
        plansza[wspIx - 1][wspIy] = 1;
        if(!Droga(plansza, wspIx-1, wspIy))
        {
            next = 0;
            plansza[wspIx-1][wspIy] = ' ';
        }
        else
        { 
           Droga(plansza, wspIx-1, wspIy); 
        //}
    }
    else if(plansza[wspIx][wspIy + 1] == ' ' && next == 0)
    {
        plansza[wspIx][wspIy + 1] = 1;
        if(!Droga(plansza, wspIx, wspIy + 1))
        {
            next = 0;
            plansza[wspIx][wspIy + 1] = ' ';
        }
        else
        { 
            Droga(plansza, wspIx, wspIy + 1);
        }
    }
    else if(plansza[wspIx][wspIy - 1] == ' ' && next == 0)
    {
        plansza[wspIx][wspIy - 1] = 1;
        if(!Droga(plansza, wspIx, wspIy - 1))
        {
            next = 0;
            plansza[wspIx][wspIy - 1] = ' ';
        }
        else
        { 
            Droga(plansza, wspIx, wspIy - 1);
        }
    }

}

int main(int argc, char *argv[])
{
    char* cstr, * str;
    int i, j, k, l, m, o;
    int c = 0; // "długość" labiryntu
    int h = 0; // "szerokość" labiryntu
    int ai, bi, cx, dx;
    string t[400];
    int ruchy[4][2];
    string zapis;
    string line;
    string sciezka;
    string t2 = " ";
    int u; // "pole" labiryntu
    int e;

    cout<<"*** Witaj w programie labirynt solver 1.0! *** \n"<<endl;

    cout<<"Podaj \230cie\276k\251 dost\251pu do pliku: ";
    cin>>sciezka;

    cout<<endl;

    cstr = new char;
    strcpy(cstr, sciezka.c_str()); // zamienia napis typu string na wskaYnik do tablicy char'ów

    ifstream labirynt(cstr);

    if (labirynt.is_open())
    {
        while (!labirynt.eof())
        {
            for(i = 0; i < 400; i++)
            {
                getline(labirynt, t[i]);
                line = t[i];
               
                if(!line.empty())
                {
                    c++;
                    h = line.length();
                }
            }
            cout<<c<<endl;
            cout<<h<<endl;
            for(j = 0; j < c; j++)
            {
                for(k = 0; k < h; k++)
                {
                    if(t[j][k] == '\\' && t[j][k+1] == 'n')
                    {
                        cout<<endl;
                    }
                    else if(t[j][k] == '*' || t[j][k] == 'I' || t[j][k] == 'X' || t[j][k] == ' ')
                    {
                        cout<<t[j][k];
                    }
                }
            }

        for(l = 0; l < c; l++)
        {
            for(m = 0; m < h; m++)
            {
                if(t[l][m] == 'I')
                {
                    ai = l;
                    bi = m;
                    cout<<"I: "<<ai<<" "<<bi<<endl;
                }
                else if(t[l][m] == 'X')
                {
                    cx = l;
                    dx = m;
                    cout<<"X: "<<cx<<" "<<dx<<endl;
                }
            }
        }
        e = h-3;
        u = c*h - c*3;
        cout<<u<<endl;

if(Droga(t, ai, bi)) //, c, e, ruchy, u, 1);
{
        for (i = 0; i < c; i++)
        {
            for (j = 0; j < h; j++)
            {
                if(t[i][j] == '\\' && t[i][j+1] == 'n')
                {
                    cout<<endl;
                }
                if (t[i][j] == 1)
                {
                    cout<<"#";
                }
                else if(t[i][j] == '*' || t[i][j] == 'I' || t[i][j] == 'X' || t[i][j] == ' ')
                {
                    cout<<t[i][j];
                }
            }
        }
            }
   
       else
        {
            cout<<"Brak rozwi\245zania. "<<endl;
        } 
    }
    labirynt.close();
}
        cout<<endl;
    
      system("PAUSE");
    return EXIT_SUCCESS;
}
0

Bardzo proszę o pomoc. Jest to niesamowicie ważne!

0

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int Droga (string plansza[], int wspIx, int wspIy)//,  /*int c, int e,  int ruchy[][2], int u, int i)
{
    int next;
    
    if(plansza[wspIx + 1][wspIy] == ' ' && next == 0) // sprawdza czy da się wykonać ruch w prawo
    {
        plansza[wspIx + 1][wspIy] = 1;
        if(!Droga(plansza, wspIx+1, wspIy)) // jeżeli da się, ale nie da się wykonać kolejnego
        {
            next = 0;
            plansza[wspIx+1][wspIy] = ' ';
        } 
        else 
        {
            Droga(plansza, wspIx+1, wspIy); // jeżeli da się wywołać kolejny, to się wywołuje
        }
    }
    else if(plansza[wspIx - 1][wspIy] == ' ' && next == 0) // sprawdza czy da się wykonać ruch w lewo
    {
        plansza[wspIx - 1][wspIy] = 1; // tak samo jak powyżej
        if(!Droga(plansza, wspIx-1, wspIy))
        {
            next = 0;
            plansza[wspIx-1][wspIy] = ' ';
        }
        else
        { 
           Droga(plansza, wspIx-1, wspIy); 
        }
    }
    else if(plansza[wspIx][wspIy + 1] == ' ' && next == 0) // sprawdza czy da się wykonać ruch w dół
    {
        plansza[wspIx][wspIy + 1] = 1;
        if(!Droga(plansza, wspIx, wspIy + 1))
        {
            next = 0;
            plansza[wspIx][wspIy + 1] = ' ';
        }
        else
        { 
            Droga(plansza, wspIx, wspIy + 1);
        }
    }
    else if(plansza[wspIx][wspIy - 1] == ' ' && next == 0) // sprawdza, czy da się wykonać ruch w górę
    {
        plansza[wspIx][wspIy - 1] = 1;
        if(!Droga(plansza, wspIx, wspIy - 1))
        {
            next = 0;
            plansza[wspIx][wspIy - 1] = ' ';
        }
        else
        { 
            Droga(plansza, wspIx, wspIy - 1);
        }
    }
}

int main(int argc, char *argv[])
{
    char* cstr, * str;
    int i, j, k, l, m, o;
    int c = 0; // "długość" labiryntu
    int h = 0; // "szerokość" labiryntu
    int ai, bi, cx, dx; // współrzędne wejścia i wyjścia
    string t[400]; // tablica labiryntu
    string zapis; // ścieżka dostępu do pliku w którym zapiszemy labirynt  z drogą
    string sciezka; // ścieżka dostępu do pliku labiryntu
 
    cout<<"*** Witaj w programie labirynt solver 1.0! *** \n"<<endl;

    cout<<"Podaj \230cie\276k\251 dost\251pu do pliku: ";
    cin>>sciezka;

    cout<<endl;

    cstr = new char;
    strcpy(cstr, sciezka.c_str()); // zamienia napis typu string na wskaYnik do tablicy char'ów

    ifstream labirynt(cstr);

    if (labirynt.is_open()) 
    {
        while (!labirynt.eof())
        {
            for(i = 0; i < 400; i++)
            {
                getline(labirynt, t[i]); 
                line = t[i];
               
                if(!line.empty()) 
                {
                    c++; // liczy jak "długi" jest labirynt (ilość linii) 
                    h = line.length(); // podaje szerokość labiryntu
                }
            }
            cout<<c<<endl;
            cout<<h<<endl;
            for(j = 0; j < c; j++) // wypisuje labirynt
            {
                for(k = 0; k < h; k++)
                {
                    if(t[j][k] == '\\' && t[j][k+1] == 'n')
                    {
                        cout<<endl;
                    }
                    else if(t[j][k] == '*' || t[j][k] == 'I' || t[j][k] == 'X' || t[j][k] == ' ')
                    {
                        cout<<t[j][k];
                    }
                }
            }

        for(l = 0; l < c; l++)
        {
            for(m = 0; m < h; m++)
            {
                if(t[l][m] == 'I')
                {
                    ai = l;
                    bi = m;
                    cout<<"I: "<<ai<<" "<<bi<<endl; // podaje współrzędne punktu wejścia
                }
                else if(t[l][m] == 'X')
                {
                    cx = l;
                    dx = m;
                    cout<<"X: "<<cx<<" "<<dx<<endl; // podaje współrzędne punktu wyjścia
                }
            }
        }
        e = h-3;
        u = c*h - c*3;
       
if(Droga(t, ai, bi)) // wywołanie funkcji wyszukującej drogę w labiryncier
{
        for (i = 0; i < c; i++) // wypisuje labirynt wraz z drogą
        {
            for (j = 0; j < h; j++)
            {
                if(t[i][j] == '\\' && t[i][j+1] == 'n') 
                {
                    cout<<endl;
                }
                else if (t[i][j] == 1)
                {
                    cout<<"#";
                }
                else if(t[i][j] == '*' || t[i][j] == 'I' || t[i][j] == 'X' || t[i][j] == ' ')
                {
                    cout<<t[i][j];
                }
            }
        }
            }
        
       else
        {
            cout<<"Brak rozwi\245zania. "<<endl;
        } 
    }
    labirynt.close();
}
    cout<<endl;
    
    cout<<"Podaj \230cie\276k\251 do pliku z rozwi\245zaniem: ";
    cin>>zapis;
    
    cout<<endl;

    str = new char;
    strcpy(str, sciezka.c_str()); // zamienia napis typu string na wskaźnik do tablicy char'ów

    ofstream plikzapisu(str);
    {
        if(plikzapisu.is_open()) // zapisuje rozwiązanie do pliku
        {
            //cout<<"Otwarto plik zapisu. "<<endl;
            if(Droga(t, ai, bi)) //, c, e, ruchy, u, 1);
            {
                for (i = 0; i < c; i++)
                {
                    for (j = 0; j < h; j++)
                    {
                        if(t[i][j] == '\\' && t[i][j+1] == 'n')
                        {
                            cout<<endl;
                        }
                        else if (t[i][j] == 1)
                        {
                            cout<<"#";
                        }
                        else if(t[i][j] == '*' || t[i][j] == 'I' || t[i][j] == 'X' || t[i][j] == ' ')
                        {
                            cout<<t[i][j];
                        }
                    }
                }
            }
        } 
       else
        {
            cout<<"Brak rozwi\245zania. "<<endl;
        } 
    }
}}
        plikzapisu.close();
    } 
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Lepiej?

Zakładamy, że"
•Pliki z labiryntami są plikami tekstowymi.
•Dopuszczalne są znaki: '' - ściana labiryntu, 'I' - wejście do labiryntu, 'X' - wyjście z labiryntu, ' ' - korytarz labiryntu. Ponadto kolejne linie oddzielone są standardowymi znakami końca linii '\n'.
•Krawędzie labiryntu są oznaczone liniami zbudowanymi z znaków '
', wyjątkiem są punkty wejścia i wyjścia do labiryntu oznaczone znakami 'I' i 'X'.
•Labirynt ma tylko jedno wejście i tylko jedno wyjście.
•Droga łącząca wejście do labiryntu (I) i wyjście (X) powinna zostać oznaczona znakami '#'. Znaki te mogą być umieszczone przez program tylko i wyłącznie w miejscach w których plik oryginalny zawiera znaki spacji ' '.
•Droga musi mieć charakter ciągły od znaku 'I' do znaku 'X'.
•Maksymalna długość linii w pliku z labiryntem wynosi 400 znaków (łącznie z znakiem końca linii).
•Algorytm wyszukiwania drogi powinien być algorytmem rekurencyjnym z powrotami.

0

Nie, nie lepiej.
Pierwszy błąd widze na samym początku funkcji droga() bo deklarujesz tam zmienną next której NIE PRZYPISUJESZ WARTOŚCI a potem o dziwo sprawdzasz jej wartość w warunkach. Swoją drogą kompilator powinien krzyczeć że nie zwracasz nic z tej funkcji (bo nie masz tam żadnego else ani bezwarunkowego returna...)
Funkcja droga powinna wyglądać tak:

int Droga (string plansza[], int wspIx, int wspIy)
{
    if(canMoveRight())
    {
		return moveRight();
    }
    else if(canMoveLeft())
    {
		return moveLeft();
    }
    else if(canMoveUp())
    {
		return moveUp();
    }
    else
    {
		return moveDown();
    }
}

Dzięki temu można czytać ten kod nie schodząc od razu na niski poziom jakichś operacji na tablicach z d**y. Podziel ten kod na funkcje które mają mniej niż 20 linijek każda. I naucz się pisac kod bez kopiowania go! Każdy z przypadków ruchu w jakimś kierunku wygląda identycznie, tylko indeksy się zmieniają. To znaczy że wszystkie te ruchy można załatwić jedną funkcją...

0
bool canMoveRight(int wspIx, int h)
{
    if(wspIx <= h)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void MoveRight(string plansza[], int wspIx, int wspIy)
{
    plansza[wspIx+1][wspIy] = 1;
}

int Droga (string plansza[], int wspIx, wspIy)
{
    if(canMoveRight == 1)
    {
        return MoveRight();
    }
}

Na przykład, tak??

1 użytkowników online, w tym zalogowanych: 0, gości: 1