Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
- using namespace std;
- enum Status { ready, processed, waiting
- };
- enum Typ {droga,sciana,wejscie,wyjscie};
- class element {
- public:
- int y;
- int x;
- Status status;
- Typ typ;
- int czasDojscia;
- element (int wspoly,int wspolx,Typ t)
- {
- status = ready;
- x = wspolx;
- y = wspoly;
- typ = t;
- czasDojscia = 0;
- }
- };
- class Kolejka
- {
- int max;
- int poczatek;
- int liczbaElementow;
- int* tab;
- element * labirynt;
- public:
- Kolejka(int maksymalnaLiczbaElementow, element * l)
- { liczbaElementow = 0;
- max=maksymalnaLiczbaElementow;
- tab = (int * ) malloc (sizeof(int)*maksymalnaLiczbaElementow);
- poczatek = 0;
- labirynt = l;
- }
- void dodaj (int e)
- {
- *(tab+(poczatek+liczbaElementow)%max) = e ;
- liczbaElementow++;
- (labirynt + e )->status = waiting;
- }
- int usun()
- {
- (labirynt+*(tab+poczatek))->status = processed;
- liczbaElementow--;
- return *(tab+poczatek++);
- }
- bool pusta()
- {
- return liczbaElementow==0;
- }
- ~Kolejka() {free(tab);}
- }
- ;
- bool czyMozna (int x,int y, int n,int m,element * labirynt)
- {
- if (x>=m || x<0 || y<0 || y>=n) {return false;}
- if ((labirynt+y*m + x)->typ==sciana ) { return false;}
- if ((labirynt+y*m + x)->status!=ready ) {return false;}
- return true;
- }
- int main()
- {
- int n,m,numerWejscia,numerWyjscia;
- cin>>n>>m;
- element * labirynt = (element*) malloc (sizeof(element)*m*n);
- Kolejka kolejka = Kolejka(m*n,labirynt);
- int we_x,we_y,wy_x,wy_y,pom;
- cin>>we_y>>we_x>>wy_y>>wy_x;
- for (int i=0; i<n*m; i++)
- {cin >> pom;
- switch (pom)
- {
- case -1:
- {*(labirynt + i ) = element(i/m,i%m,sciana);
- break;
- }
- case 0:
- {
- *(labirynt + i ) = element(i/m,i%m,droga);
- break;
- }
- case -5:
- { if (i/m == we_y && i%m == we_x)
- {*(labirynt + i ) = element(i/m,i%m,wejscie);
- numerWejscia = i;}
- else if (i/m == wy_y && i%m == wy_x)
- {*(labirynt + i ) = element(i/m,i%m,wyjscie);
- numerWyjscia = i;}
- break;
- }}}
- if (wy_y >= n || wy_x >=m ) {cout<<"NIE WYJDZIESZ ;("; return 0;free(labirynt);}
- kolejka.dodaj(numerWejscia);
- int wynik=m*n;
- while (!kolejka.pusta())
- {
- element * pom = labirynt + kolejka.usun();
- int czasDojsciaPom = pom->czasDojscia;
- if (pom->typ==wyjscie)
- {
- if (pom->czasDojscia<wynik);
- wynik = pom->czasDojscia;
- }
- if (czyMozna(pom->x-1,pom->y,n,m,labirynt)) {(labirynt+pom->x-1+pom->y*m)->czasDojscia = czasDojsciaPom+1; kolejka.dodaj(pom->x-1+pom->y*m);}
- if (czyMozna(pom->x+1,pom->y,n,m,labirynt)) {(labirynt+pom->x+1+pom->y*m)->czasDojscia = czasDojsciaPom+1;kolejka.dodaj(pom->x+1+pom->y*m);}
- if (czyMozna(pom->x,pom->y-1,n,m,labirynt)) {(labirynt+pom->x+(pom->y-1)*m)->czasDojscia = czasDojsciaPom+1;kolejka.dodaj(pom->x+(pom->y-1)*m);}
- if (czyMozna(pom->x,pom->y+1,n,m,labirynt)) {(labirynt+pom->x+(pom->y+1)*m)->czasDojscia = czasDojsciaPom+1;kolejka.dodaj(pom->x+(pom->y+1)*m);}
- }
- if (wynik==m*n) cout<<"NIE WYJDZIESZ ;(";
- else cout<<wynik;free(labirynt);
- }
Add Comment
Please, Sign In to add comment