我有这个函数来解决C ++中的迷宫,但是当我运行程序时,我在递归中遇到错误的访问错误。我认为可能是一个无限循环。我不知道哪里出了什么问题。
bool Solve_Maze(int coorx,int coory) {
if((Map[coorx][coory]==Start)||(Map[coorx][coory]==path)) {
Map[coorx][coory]=wall;
Solve_Maze(coorx+1,coory);
Solve_Maze(coorx-1,coory);
Solve_Maze(coorx,coory+1);
Solve_Maze(coorx,coory-1);
}else if(Map[coorx][coory]==End) {
cout<<"You Solved the Maze!"<<endl;
delete Map;
return(true);
}
}
答案 0 :(得分:2)
1)如果声明为
,您没有返回任何值
2)Map [coorx] [coory]总是在所有函数调用中分配到墙。墙是指全局状态吗?
答案 1 :(得分:2)
我将函数更改为返回void,因为该值未正确返回堆栈。在这种情况下,您只需使用全局找到变量来检查是否找到了结尾。 (这将要求您在运行函数之前每次都设置'found = false'。
bool found = false;
您还想进行一些输入验证
if( coorx > maxX || coorx < 0 || coory > maxY || coory < 0) return;
您需要将maxX和maxY替换为coorx和coory的最大值1以上。这将确保您不会收到错误的访问错误。
bool found = false; // this will be global scope or pass it by reference
Solve_Maze(x,y);
// if(found) - found will be true if you found the end
void Solve_Maze(int coorx,int coory) {
if( coorx > maxX || coorx < 0 || coory > maxY || coory < 0) return;
else if(((Map[coorx][coory]==Start)||(Map[coorx][coory]==path))) {
Map[coorx][coory]=wall;
Solve_Maze(coorx+1,coory);
Solve_Maze(coorx-1,coory);
Solve_Maze(coorx,coory+1);
Solve_Maze(coorx,coory-1);
}else if(Map[coorx][coory]==End) {
cout<<"You Solved the Maze!"<<endl;
delete Map;
found = true;
}
}
答案 2 :(得分:0)
在调试器(gdb或dbx)中运行它。使用-g标志进行编译,以便调试程序。如果您不知道如何使用调试器,请谷歌“dbx cheatsheet”。您可以隔离它在循环中的位置(如果您的猜测是正确的)并逐步完成。你需要在调试器中熟练地完成这项工作的总时间,实际上要花费的时间少于你已经考虑过它的时间。
没有讽刺的意思 - 人们经常高估学习调试器的工作,所以我想要确定即使对于一个简单的问题它也是值得的,并且为大问题付出了巨大的回报。