Dzień dobry,
Jakiś czas temu napisałem pewien kod (kod na ideone), nie jest on dokończony, ale nie potrafię zrozumieć, dlaczego dla przykładowych danych crashuje w linijce, w której odwołuję się do dynamicznej dwuwymiarowej tablicy, niezależnie, do którego pola bym się odwołał, czy to do 0,0; czy też do innego konkretnego. Program kompiluje się, ale crashuje po wpisaniu przykładowych danych.
Kod:
#include <iostream>
#include <queue>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
int il,kolumny,wiersze,xbohatera,ybohatera,aktx,akty,popx,popy;
cin>>il;
for(int i = 0; i < il; i++)
{
cin>>wiersze>>kolumny;
char **tab;
tab = new char*[wiersze];
int **odl;
odl = new int*[wiersze];
for(int j = 0; j < wiersze; j++)
{
tab[j]=new char[kolumny];
odl[j]=new int[kolumny];
for(int k = 0; k < kolumny; k++)
{
cin>>tab[j][k];
if(tab[j][k]=='@')
{
xbohatera=k;
ybohatera=j;
}
odl[j][k]=-1;
}
}
cout<<tab[0][0];
//tu nalezy przygotowac i rozpoczac przeszukiwanie
queue <int> wspx;
queue <int> wspy;
wspx.push(xbohatera);
wspy.push(ybohatera);
popx=xbohatera;
popy=ybohatera;
odl[ybohatera][xbohatera]=0;
cout<<odl[ybohatera][xbohatera];
while(wspx.empty()!=true)
{
cout<<'x';
aktx=wspx.front();
wspx.pop();
akty=wspy.front();
wspy.pop();
//oznaczenie sasiadujacych kropek i plusow odlegloscia i dodanie ich wspolrzednych do kolejki
if(aktx-1>-1)
{
if(tab[akty][aktx-1]=='.'||tab[akty][aktx-1]=='+') //odwiedzic tylko, jezeli odwiedzenie mozliwe
{
if(odl[akty][aktx-1]==-1) //odwiedzic tylko, jezeli nieodwiedzone
{
odl[akty][aktx-1]=odl[popy][popx]+1;
wspx.push(aktx-1);
wspy.push(akty);
if(tab[akty][aktx-1]=='>') //jezeli koniec
{
cout<<odl[popy][popx]+1<<endl;
break;
}
}
}
}
if(aktx+1<wiersze)
{
if(tab[akty][aktx+1]=='.'||tab[akty][aktx+1]=='+') //odwiedzic tylko, jezeli odwiedzenie mozliwe
{
if(odl[akty][aktx+1]==-1) //odwiedzic tylko, jezeli nieodwiedzone
{
odl[akty][aktx+1]=odl[popy][popx]+1;
wspx.push(aktx+1);
wspy.push(akty);
if(tab[akty][aktx+1]=='>') //jezeli koniec
{
cout<<odl[popy][popx]+1<<endl;
break;
}
}
}
}
if(akty-1>-1)
{
if(tab[akty-1][aktx]=='.'||tab[akty-1][aktx]=='+') //odwiedzic tylko, jezeli odwiedzenie mozliwe
{
if(odl[akty-1][aktx]==-1) //odwiedzic tylko, jezeli nieodwiedzone
{
odl[akty-1][aktx]=odl[popy][popx]+1;
wspx.push(aktx);
wspy.push(akty-1);
if(tab[akty-1][aktx]=='>') //jezeli koniec
{
cout<<odl[popy][popx]+1<<endl;
break;
}
}
}
}
if(akty+1<kolumny)
{
if(tab[akty+1][aktx]=='.'||tab[akty+1][aktx]=='+') //odwiedzic tylko, jezeli odwiedzenie mozliwe
{
if(odl[akty+1][aktx]==-1) //odwiedzic tylko, jezeli nieodwiedzone
{
odl[akty+1][aktx]=odl[popy][popx]+1;
wspx.push(aktx);
wspy.push(akty+1);
if(tab[akty+1][aktx]=='>') //jezeli koniec
{
cout<<odl[popy][popx]+1<<endl;
break;
}
}
}
}
popx=aktx;
popy=akty;
if(wspx.empty()==true)
{
cout<<"NIE"<<endl;
break;
}
} //nawias petli while
for(int j = 0; j < wiersze; j++)
{
delete [] tab[j];
delete [] odl[j];
}
delete [] tab;
delete [] odl;
}
return 0;
}
Przykładowe dane:
1
4 8
....#...
.##.#.#.
.##.#.#.
.@#...#>
Pozdrawiam