Witam. Mam do napisania projekt z c++. Musze wygenerowac macierz 0/1. w moim przypadku przyjalem spacja i "x". macierz jest mapa po ktorej ma sie poruszac "robot". i znalezc w jakikolwiek sposob droge ze startu do mety. na poczatku tworze tablice statyczna, potem przeksztalcam ja w tablice wskaznikow. kazdemu wskanikowi rezerwuje miejsce i che zrobic graf ktory uzalezni kazde pole od siebie.
chodzi o to zeby od kazdego punktu robot wiedzial gdzie sie moze poruszyc. jezeli w lewo ma wolne pole to zeby wskaznik w lewo wskazywal na to pole. a jak ma przeszkode czyli X lub krawedz to zeby wskazywal NULL. program ktorego kod wysylam kompiluje sie ale nie dziala poprawnie. mysle ze moge sie myslic w funkcji rob_graf oraz szukaj_drogi oraz szukaj_drogi2. prosilbym o sprawdzenie tych dwoch funkcji pod wzgledem bledow logicznych itp. pozdrawiam
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
struct droga{
string dane;
droga *lewo;
droga *prawo;
droga *gora;
droga *dol;
};
const int a=4,b=4;
void losuj_mape (string tab[][b])
{int x;
for (int i=0;i<a;i++)
{for (int j=0;j<b;j++)
{x=(rand()%3)%2;
if(x==1){
tab[i][j]="X";}
else tab[i][j]=" ";
}
}
}
void pokaz_mape(string tab[][b])
{for (int k=0;k<a+2;k++) cout<<"* ";
cout<<endl;
for (int i=0;i<a;i++)
{cout<<"* ";
for (int j=0;j<b;j++)
{cout<<tab[i][j]<<" ";
}
cout<<"*"<<endl;
}for (int p=0;p<a+2;p++) cout<<"* ";
cout<<endl;
}
void losuj_pozycje( int &i, int &j, string T[][b], droga *A[][b])
{int k,f;
do {i=rand()%a;
j=rand( )%b;
k=rand( )%a;
f=rand( )%b;
}while(T[i][j]!=" " && T[k][f]!=" ");
T[i][j]="S";
T[k][f]="M";
A[i][j]->dane="S";
A[k][f]->dane="M";
}
void rob_graf(string T[][b], droga *A[][b] )
{////////////////////////////////////////////
for (int i=0;i<a;i++)
{for (int j=0;j<b;j++)
{A[i][j]=new droga;
(A[i][j])->dane=T[i][j];
}
}
///////////////////////////////////////////////
for (int i=0;i<a;i++)
{for (int j=0;j<b-1;j++)
{ if(A[i][j+1]->dane==" "){A[i][j]->prawo=A[i][j+1];}
else {A[i][j]->prawo=NULL;}
}
A[i][b-1]->prawo=NULL;
}
//////////////////////////////////////
for (int i=0;i<a;i++)
{for (int j=b-1;j>0;j--)
{ if(A[i][j-1]->dane==" "){A[i][j]->lewo=A[i][j-1];}
else {A[i][j]->lewo=NULL;}
}
A[i][0]->lewo=NULL;
}
//////////////////////////////////////////
for (int i=0;i<a-1;i++)
{ for (int j=0;j<b;j++)
{ if (A[i+1][j]->dane==" "){A[i][j]->dol=A[i+1][j];}
else {A[i][j]->dol=NULL;}
A[a-1][j]->dol=NULL;
}
}
/////////////////////////////////////////
for (int i=a-1;i>0;i--)
{for (int j=0;j<0;j++)
{ if(A[i-1][j]->dane==" "){A[i][j]->gora=A[i-1][j];}
else {A[i][j]->gora=NULL;}
A[0][j]->gora=NULL;
}
}}
void kasuj(droga *A[][b])
{for (int i=0;i<a;i++)
{for (int j=0;j<b;j++)
{
delete A[i][j];
}
}
}
void pokaz_mape2(droga *tab[][b])
{for (int k=0;k<a+2;k++) cout<<"* ";
cout<<endl;
for (int i=0;i<a;i++)
{cout<<"* ";
for (int j=0;j<b;j++)
{cout<<tab[i][j]->dane<<" ";
}
cout<<"*"<<endl;
}for (int p=0;p<a+2;p++) cout<<"* ";
cout<<endl;
}
void szukaj_drogi(droga *&wsk) // algorytm szukania drogi wedlug mnie jest sensowny
{ bool z=false; // algorytm polega na tym iz losuje liczbe <0,3>
// do kazdej strony jest przypisana liczba i wtedy program po omacku bada losowo wybrana strone
while (z!=true){
int x=rand()%4;
z=false;
if (x==0){
if(wsk->lewo==NULL || wsk->lewo->dane=="S") {szukaj_drogi(wsk);}
else if(wsk->lewo->dane=="M"){getch(); z=true;}
else {wsk=wsk->lewo; wsk->dane=".";}
}
if (x==1){
if(wsk->prawo==NULL || wsk->prawo->dane=="S") {szukaj_drogi(wsk);}
else if(wsk->prawo->dane=="M"){getch(); z=true;}
else {wsk=wsk->prawo; wsk->dane=".";}
}
if (x==2){
if(wsk->gora==NULL || wsk->gora->dane=="S") {szukaj_drogi(wsk);}
else if(wsk->gora->dane=="M"){getch(); z=true;}
else {wsk=wsk->gora; wsk->dane=".";}
}
if (x==3){
if(wsk->dol==NULL || wsk->dol->dane=="S") {szukaj_drogi(wsk);}
else if(wsk->dol->dane=="M"){getch(); z=true;}
else {wsk=wsk->dol; wsk->dane=".";}
}
}
if (z==true){cout<<endl<<"grejt"<<endl;} }
void szukaj_drogi2(droga *&wsk){
int x; bool z=false;
while(z!=true){
x=rand()%4;
z=false;
cout<<x;
getch();
switch (x)
{
case 0: {
if(wsk->lewo==NULL || wsk->lewo->dane=="S") {szukaj_drogi2(wsk);}
else if(wsk->lewo->dane=="M"){z=true;}
else {wsk=wsk->lewo; wsk->dane=".";}
} break;
case 1: {
if(wsk->prawo==NULL || wsk->prawo->dane=="S") {szukaj_drogi2(wsk);}
else if(wsk->prawo->dane=="M"){z=true;}
else {wsk=wsk->prawo; wsk->dane=".";}
}
break;
case 2: {
if(wsk->gora==NULL || wsk->gora->dane=="S") {szukaj_drogi2(wsk);}
else if(wsk->gora->dane=="M"){z=true;}
else {wsk=wsk->gora; wsk->dane=".";}
} break;
case 3: {
if(wsk->dol==NULL || wsk->dol->dane=="S") {szukaj_drogi2(wsk);}
else if(wsk->dol->dane=="M"){z=true;}
else {wsk=wsk->dol; wsk->dane=".";}
} break;
}
}
if (z==true) {cout<<endl<<"grejt"<<endl;} }
int main(int argc, char *argv[])
{
string T[a][b];
int i, j;
losuj_mape(T);
pokaz_mape(T);
droga *A[a][b];
rob_graf(T,A);
losuj_pozycje(i,j,T,A);
cout<<endl;
pokaz_mape(T);
droga *wsk;
wsk=A[i][j];
cout<<A[3][2]->dane<<" "<<A[2][1]->gora->dol->dane;
pokaz_mape2(A);
cout<<wsk->prawo->prawo->dane;
// zadzialalo dopiero gdy zmniejszylem rozmiar macierzy do 3x3, ale nie zawsze
//chce to dzialac. program sie wlacza i od razy wylacza
// czasem usuwajac ta funkcje program sie wykonuje, jezeli jest ona to prkatycznie
// ciagle program sie otweira i od razu zamyka
system("PAUSE");
return EXIT_SUCCESS;
}