Алгоритм кратчайшего пути в C ++ - PullRequest
0 голосов
/ 09 июня 2018

Я борюсь с алгоритмом, который довольно прост в своей основе.У меня есть массив, заполненный:

O- path
X- wall
*-main hero
W-exits

У меня есть проблема, потому что я создал массив, который должен содержать разветвленные пути, которые позже в программе я могу проанализировать снова.Если у нас есть три разных пути, алгоритм должен сначала идти вниз, затем вправо, влево и, наконец, вверх.Если выход найден, программа должна проверить, ведут ли другие пути к выходу, и если да, сравнить счетчики (licznik).Но после одного запуска программа не будет проверять другие пути из моего массива.Есть идеи что не так?

Это мой код:

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

void display(int wiersze, int kolumny, string** labirynth)
{
    //system("cls");
for(int i = 0 ; i<wiersze; ++i)
{
    for(int j = 0; j<kolumny; ++j)
    {
        cout << "[" <<labirynth[i][j]<<"]";
    }
    cout << endl;
}
}

int main()
{
      int wiersze,kolumny,startkol,startwier,exits,X,Y;
wiersze=8;
string** labirynth = new string* [wiersze];
//tworzy labirynt
for(int i = 0; i<wiersze; ++i)
{
    labirynth[i]= new string[kolumny];
}
//wypelnia brzegi
for(int i = 0 ; i<wiersze; ++i)
{

    for(int j = 0; j<kolumny; ++j)
    {
        if(i==0 || j==0 || i==wiersze-1 || j==kolumny-1)
        {
            labirynth[i][j]="X";
        }
        else
        {
            labirynth[i][j]=" ";
        }

    }
}
display(wiersze,kolumny,labirynth);
/*/
cout<<"Podaj punkt startowy X."<<endl;
cin >>startkol;
cout<<"Podaj punkt startowy Y."<<endl;
cin >> startwier;
/*/
startkol=4;
startwier=1;
labirynth[startwier-1][startkol-1]="*";

display(wiersze,kolumny,labirynth);
/*/
    cout<< "Podaj ilosc wyjsc." <<endl;
    cin >> exits;
    int exitX, exitY;
    for(int i = 0 ; i<exits; i++)
    {
        cout << "Podaj X wyjscia nr. " << i+1 << endl;
        cin >> X;
        cout << "Podaj Y wyjscia nr. " << i+1 << endl;
        cin >> Y;
        labirynth[Y-1][X-1]="W";
        exitX = X-1;
        exitY = Y-1;

        display(wiersze,kolumny,labirynth);
    }
    /*/
/////////////////////////ustawiam wyjscie i sciezki
labirynth[7][5]="W";
labirynth[1][3]="O";
labirynth[2][3]="O";
labirynth[2][2]="O";
labirynth[2][1]="O";
labirynth[2][0]="W";
labirynth[3][3]="O";
labirynth[5][3]="O";
labirynth[4][3]="O";
labirynth[4][4]="O";
labirynth[4][5]="O";
labirynth[5][5]="O";
labirynth[6][5]="O";

display(wiersze,kolumny,labirynth);
////////////////////////
/*/
for(;;)
{
    cout << "Podaj X sciezki" <<endl;
    cin>>X;
    if(X==0)
    {
        break;
    }
    cout << "Podaj Y sciezki" << endl;
    cin >> Y;
    labirynth[Y-1][X-1]="O";
    display(wiersze,kolumny,labirynth);

}
/*/
//filler
for(int i = 0 ; i<wiersze; ++i)
{

    for(int j = 0; j<kolumny; ++j)
    {
        if(labirynth[i][j]==" ")
        {
            labirynth[i][j]="X";
        }

    }
}


int licznik=0;
int sk=startkol-1;
int sw=startwier-1;
bool spr[4];
spr[0] = false;
int pom[3][100];
for(int i=0; i<3; i++)
{
    for(int j=0; j<100; j++)
    {
        pom[i][j]=0; //sets pom to 0

    }
}
int counter = 0;
while(sw+1<wiersze && sk+1<kolumny)
{


    if(labirynth[sw+1][sk]=="O")
    {
        spr[0] = true;

        labirynth[sw][sk] = "%";
        sw += 1;
        cout<<"->Down";
        if(labirynth[sw+1][sk]=="W")
        {
            labirynth[sw][sk] = "%";
            cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
            break;
        }
    }
    if(labirynth[sw][sk-1]=="O" && spr[0])
    {
        pom[0][counter] = sk - 1;
        pom[1][counter] = sw;
        pom[2][counter] = licznik;
        counter++;
        if(labirynth[sw+1][sk]=="W")
        {
            labirynth[sw][sk] = "%";
            cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
            break;
        }

    }
    if(labirynth[sw][sk-1]=="O" && !spr[0])
    {
        labirynth[sw][sk] = "%";
        sk -= 1;
        cout<<"->Left";
        if(labirynth[sw+1][sk]=="W")
        {
            labirynth[sw][sk] = "%";
            cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
            break;
        }

    }
    if(labirynth[sw][sk+1]=="O" && spr[0])
    {
        pom[0][counter] = sk + 1;
        pom[1][counter] = sw;
        pom[2][counter] = licznik;

        counter++;
        if(labirynth[sw+1][sk]=="W")
        {
            labirynth[sw][sk] = "%";
            cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
            break;
        }
    }
    if(labirynth[sw][sk+1]=="O" && !spr[0] )
    {
        labirynth[sw][sk] = "%";
        sk += 1;
        cout<<"->Right";
        if(labirynth[sw+1][sk]=="W")
        {
            labirynth[sw][sk] = "%";
            cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
            break;
        }

    }
    if(labirynth[sw-1][sk]=="O" && spr[0])
    {
        pom[0][counter] = sk;
        pom[1][counter] = sw - 1;
        pom[2][counter] = licznik;
        counter++;
        if(labirynth[sw+1][sk]=="W")
        {
            labirynth[sw][sk] = "%";
            cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
            break;
        }
    }
    if(labirynth[sw-1][sk]=="O" && !spr[0])
    {
        labirynth[sw][sk] = "%";
        sw -= 1;
        cout<<"->Up";
        if(labirynth[sw+1][sk]=="W")
        {
            labirynth[sw][sk] = "%";
            cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
            break;
        }
    }

    spr[0] = false;
    if(labirynth[sw-1][sk]!="O" && labirynth[sw+1][sk]!="O" && labirynth[sw][sk+1]!="O" && labirynth[sw][sk-1]!="O")
    {
        cout<<endl<<"NO EXITS FOUND"<<endl;
        break;
    }
}
display(wiersze,kolumny,labirynth);
cout<<endl;
for(int i=0; i<3; i++)
{
    for(int j=0; j<100; j++)
    {
        if(pom[i][j]==0)
        {
            break;
        }
        cout<<pom[i][j];
    }
    cout<<endl;
}
int i =0;


for(;;)
{
    sw=pom[0][i];
    sk=pom[1][i];

    if(pom[0][i]==0 && pom[1][i]==0 && pom[2][i]==0)
    {
        break;
    }
    else
    {

        while(sw+1<wiersze && sk+1<kolumny)
        {


            if(labirynth[sw+1][sk]=="O")
            {
                spr[0] = true;

                labirynth[sw][sk] = "%";
                sw += 1;
                cout<<"->Down";
                if(labirynth[sw+1][sk]=="W")
                {
                    labirynth[sw][sk] = "%";
                    cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
                    break;
                }
            }
            if(labirynth[sw][sk-1]=="O" && spr[0])
            {
                pom[0][counter] = sk - 1;
                pom[1][counter] = sw;
                pom[2][counter] = licznik;
                counter++;
                if(labirynth[sw+1][sk]=="W")
                {
                    labirynth[sw][sk] = "%";
                    cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
                    break;
                }

            }
            if(labirynth[sw][sk-1]=="O" && !spr[0])
            {
                labirynth[sw][sk] = "%";
                sk -= 1;
                cout<<"->Left";
                if(labirynth[sw+1][sk]=="W")
                {
                    labirynth[sw][sk] = "%";
                    cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
                    break;
                }

            }
            if(labirynth[sw][sk+1]=="O" && spr[0])
            {
                pom[0][counter] = sk + 1;
                pom[1][counter] = sw;
                pom[2][counter] = licznik;

                counter++;
                if(labirynth[sw+1][sk]=="W")
                {
                    labirynth[sw][sk] = "%";
                    cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
                    break;
                }
            }
            if(labirynth[sw][sk+1]=="O" && !spr[0] )
            {
                labirynth[sw][sk] = "%";
                sk += 1;
                cout<<"->Right";
                if(labirynth[sw+1][sk]=="W")
                {
                    labirynth[sw][sk] = "%";
                    cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
                    break;
                }

            }
            if(labirynth[sw-1][sk]=="O" && spr[0])
            {
                pom[0][counter] = sk;
                pom[1][counter] = sw - 1;
                pom[2][counter] = licznik;
                counter++;
                if(labirynth[sw+1][sk]=="W")
                {
                    labirynth[sw][sk] = "%";
                    cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
                    break;
                }
            }
            if(labirynth[sw-1][sk]=="O" && !spr[0])
            {
                labirynth[sw][sk] = "%";
                sw -= 1;
                cout<<"->UP";
                if(labirynth[sw+1][sk]=="W")
                {
                    labirynth[sw][sk] = "%";
                    cout<<endl<<"EXIT FOUND on: ["<<sw+2<<"]["<<sk+1<<"]"<<endl;
                    break;
                }
            }

            spr[0] = false;
            if(labirynth[sw-1][sk]!="O" && labirynth[sw+1][sk]!="O" && labirynth[sw][sk+1]!="O" && labirynth[sw][sk-1]!="O")
            {
                cout<<endl<<"NO EXITS FOUND"<<endl;
                break;
            }
        }




    }
    i++;

}

return 0;
}
...