#include #include #include using namespace std; template class Matrica { public: Matrica() {} Matrica( unsigned s, unsigned v, T t ) : _podaci(s) { // proveru da su s i v > 0 ostavljamo za drugu priliku for( unsigned i=0; i(v); _podaci[i].resize(v); for( unsigned j=0; j& operator[]( unsigned i ) { return _podaci[i]; } const vector& operator[]( unsigned i ) const { return _podaci[i]; } private: vector< vector > _podaci; }; class Lavirint { public: class Pozicija { public: unsigned x,y; int prethodna; Pozicija( unsigned _x, unsigned _y, int _p ) : x(_x), y(_y), prethodna(_p) {} }; Lavirint() : pronadjenPut(false) {} void PronalazenjePocetaka() { unsigned s = _mapa.Sirina(), v = _mapa.Visina(); for( unsigned i=0; i( _mapa.Sirina(), _mapa.Visina(), false ); // trazimo while( tekuca < putanja.size() && !pronadjenPut ){ if( putanja[tekuca].y > 0 ) proveraPolja( putanja[tekuca].x, putanja[tekuca].y-1, tekuca ); if( putanja[tekuca].y < _mapa.Visina()-1 ) proveraPolja( putanja[tekuca].x, putanja[tekuca].y+1, tekuca ); if( putanja[tekuca].x > 0 ) proveraPolja( putanja[tekuca].x-1, putanja[tekuca].y, tekuca ); if( putanja[tekuca].x < _mapa.Sirina()-1 ) proveraPolja( putanja[tekuca].x+1, putanja[tekuca].y, tekuca ); tekuca++; } if( pronadjenPut ) RestauracijaPutanje( tekuca-1 ); } void RestauracijaPutanje( int poslednje ) { _put = Matrica( _mapa.Sirina(), _mapa.Visina(), false ); for( int i=poslednje; i>0; i=putanja[i].prethodna ) _put[putanja[i].x][putanja[i].y] = true; } void proveraPolja( unsigned x, unsigned y, int prethodno ) { if( _mapa[x][y] == 'O' ){ pronadjenPut = true; } else if( _mapa[x][y] == ' ' && !_obradjeno[x][y] ){ putanja.push_back( Pozicija(x,y,prethodno) ); _obradjeno[x][y] = true; } } void Citaj( istream& istr ) { unsigned s,v; istr >> s >> v; _mapa = Matrica( s, v, ' ' ); for( unsigned i=0; i> ws; for( unsigned j=0; j _mapa; Matrica _obradjeno; Matrica _put; vector putanja; unsigned xPocetka, yPocetka; bool pronadjenPut; }; istream& operator >> ( istream& istr, Lavirint& l ) { l.Citaj(istr); return istr; } ostream& operator << ( ostream& ostr, const Lavirint& l ) { l.Pisi(ostr); return ostr; } main() { Lavirint l; ifstream f("lavirint.dat"); f >> l; l.PronalazenjeNajkracegPuta(); cout << l; return 0; }