Я борюсь с алгоритмом, который довольно прост в своей основе.У меня есть массив, заполненный:
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;
}