0

我有这个函数来解决 C++ 中的迷宫,但是当我运行程序时,我在递归中得到了错误的访问错误。我认为 in 可能是一个无限循环。我不知道哪里出了问题。

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);
    }
}
4

3 回答 3

2

1)您没有在 if 语句中返回任何值
2) Map[coorx][coory] ​​在所有函数调用中始终分配给 wall .. wall 是否指全局状态?

于 2012-05-19T05:27:54.367 回答
2

我将函数更改为返回 void,因为该值未正确返回堆栈。在这种情况下,您将只使用全局found变量来检查是否找到了结尾。(这将要求您在每次运行该函数之前设置“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;
    }
}
于 2012-05-19T05:49:32.933 回答
0

在调试器(gdb 或 dbx)中运行它。使用 -g 标志进行编译,以便可以调试您的程序。如果您不知道如何使用调试器,请搜索“dbx cheatsheet”。您可以隔离它卡在循环中的位置(如果您的猜测是正确的)并逐步完成。您需要足够精通调试器来执行此操作以及实际执行此操作所需的总时间少于您已经花在思考上的时间。

没有讽刺的意思 - 人们确实经常高估学习调试器的工作,所以我想真正断言即使对于一个简单的问题它也是值得的,并且为大问题带来了巨大的回报。

于 2012-05-19T05:23:03.880 回答