/* примерен лабиринт 5 5 s 1 # 1 1 1 # 1 # 1 1 1 # # 1 1 1 1 1 e 1 1 1 1 1 1-проходима - първоначалния замисъл беше, проходимите клетки да са инициализирани с ' ', но поради спецификата на оператор >> представянето е сменено с '1' - може да помислите как да се реализира със ' ' s-начало е-край #-стена *-обходен */ #include using namespace std; const int MAX = 20; // n-реда, n<=MAX // m- стълба, m<= MAX int n ,m; char labirinth [MAX][MAX]; void printLab() { for ( int i =0; i< n ; i++) { for ( int j =0; j< m ; j++) cout<< labirinth[i][j]<<' '; cout<> n >> m; for ( int i =0; i< n ; i++) for ( int j =0; j< m ; j++) cin>> labirinth[i][j]; } bool isFree ( char& a) { // беше return a != '#' || a != '*'; // ето тук беше причината да не тръгне в последната минута на практикума // причината е в дизюнкцията, която винаги ще връща true ( оставам на вас да се сетите сами, ако все пак някой има затруднения - да ми пише) return a != '#' && a != '*'; } void findStart( int & i, int & j ) { for ( int k= 0; k< n ; k++) { for ( int l = 0; l< m; l++) { if( labirinth[k][l] == 's') { i= k; j= l; return; } } } i = j = -1; // !!! все пак реших при липсата на начална позиция в лабиринта да се връщат невалидни индекси!!! } bool findPath ( int x , int y) { if( x<0 || y< 0 || x>= n || y >= m) return false; if ( labirinth[x][y] == 'e' ) return true ; labirinth[x][y]= '*'; // надолу if( isFree( labirinth[x+1] [y]) && findPath( x+1, y)) return true; // нагоре if( isFree( labirinth[x-1] [y]) && findPath( x-1, y)) return true; // наляво if( isFree( labirinth[x] [y-1]) && findPath( x, y-1)) return true; //надясно if( isFree( labirinth[x] [y+1]) && findPath( x, y+1)) return true; return false; } bool solveLab() { inputLab(); int xi, yi; findStart( xi, yi); if ( findPath( xi, yi) ) { labirinth[xi][yi]= 's'; // във findPath(), когато сме обходили стартовата позиция, сме сменили символа 's' на '*' // затова сега го връщаме към началната си позиция- по-коректно би било да се ресетва // винаги, а не само когато има път от началото до края // затова ще повтора ресетването няколко реда по-надолу - може да помислите как да избегнете повторението на код cout<<"There is path\n"; printLab(); return true ; } else { labirinth[xi][yi] = 's'; cout<< "There isn`t path\n"; printLab(); // сега може да видите и къде сме ходили, когато не е имало път- реално това са всички достъпни и проходими клетки // от началото на лабиринта return false; } } int main() { solveLab(); return 0; }