Я пытаюсь реализовать решение проблемы, в которой мне нужно найти путь в лабиринте рекурсивно от источника к цели.Проведите лабиринт, чтобы добраться от источника к цели
Пусть это лабиринт: S X X X X X . . . . . X X . X X X X X . X X X X . . . X . G X X . . . X
где
Х- блокировали путь
.- Открытый путь
S-Start
G -Goal
У меня есть написанный следующим кодом для реализации решения, но он дает мне ошибку сегментации. Я был бы рад, если бы кто-нибудь мог предложить мне, где я делаю это неправильно.
Мое решение
#include<iostream>
using namespace std;
void printGrid(char grid[6][6])
{
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
cout<<grid[i][j]<<" ";
}
cout<<"\n";
}
}
bool isValidPoint(char grid[6][6],int x,int y)
{
if(x<0 || x>5 || y<0 || y>5)
{
return false;
}
if(grid[x][y]=='X')
{
return false;
}
return true;
}
bool traceMaze(char grid[6][6],int x,int y)
{
if(!isValidPoint(grid,x,y))
{
return false;
}
if(grid[x][y]=='G')
{
return true;
}
grid[x][y] = '+';
if(traceMaze(grid,x-1,y)){return true;}
if(traceMaze(grid,x,y+1)){return true;}
if(traceMaze(grid,x+1,y)){return true;}
if(traceMaze(grid,x,y-1)){return true;}
grid[x][y] = '.';
return false;
}
int main()
{
char grid[6][6] = {{'S','X','X','X','X','X'},{'.','.','.','.','.','X'},{'X','.','X','X','X','X'},{'X','.','X','X','X','X'},{'.','.','.','X','.','G'},{'X','X','.','.','.','X'}};
cout<<"Initial grid is as follows :\n";
printGrid(grid);
cout<<"\nStarting at : (0,0)\nTracing the path to the Goal\n";
cout<<traceMaze(grid,0,0)<<"\n";
cout<<"\nFinal grid is as follows :\n";
printGrid(grid);
return 0;
}
PS: Я предполагаю, что размер лабиринта быть 6X6 ...
Correct Solution :
я не имел никакого чек для '+', что я пробивался, чтобы увидеть последний прослеживаемый путь.
Так что теперь я применил чек там и функция isValidPoint
превращается в:
bool isValidPoint(char grid[6][6],int x,int y)
{
if(x<0 || x>5 || y<0 || y>5)
{
return false;
}
if(grid[x][y]=='X' || grid[x][y]=='+')
{
return false;
}
return true;
}
Благодарим Вас за помощь, ребята :)
Я получил этот вопрос полное время интервью в прошлом году.
Моя цель добавить '+' здесь, чтобы просто увидеть трассированный путь, который будет отображаться в вызове printGrid() перед возвратом 0; –
Отладчик и несколько минут вашего времени могут сразу же выявить вашу ошибку. Аналогично с дампом 'std :: cerr' ваших значений' x' и 'y' немедленно ** перед ** использованием их для разыгрывания вашего лабиринта для чтения/записи. – WhozCraig