我想实现一个问题的解决方案,其中我需要从源到目标递归地在迷宫中找到路径。追踪迷宫,从源头到达目标
假设这是迷宫: S X X X X X . . . . . X X . X X X X X . X X X X . . . X . G X X . . . X
其中
X-受阻路径
.-开放路径
S-开始
ģ-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;
}
感谢您的帮助球员:)
去年我得到了这个问题一个全职的采访。
我在这里添加'+'的目的是看到跟踪的路径,它会在返回0之前反映在printGrid()调用中; – 2014-10-02 04:22:27
调试器和几分钟的时间会几乎立即暴露您的错误。同样,在**之前立即使用'x'和'y'值的'std :: cerr'转储,并使用它们来取消您的迷宫阅读/写作。 – WhozCraig 2014-10-02 04:27:21