【问题标题】:Segmentation Fault trying to recursively solve maze尝试递归解决迷宫的分段错误
【发布时间】:2014-10-25 07:00:53
【问题描述】:

这是我的代码。我已经阅读了如何使用递归算法来解决迷宫问题,这应该可以工作,但是我一直遇到分段错误,我不知道为什么。如果你能帮助我,那就太好了。谢谢。

bool FindPath(Maze& m, int x, int y){

    RoomType rt = m.GetRoomType(x,y);

    if (rt == RoomType::Outside)
        return false;

    if (rt == RoomType::Treasure){
        return true; 
    }

    if (rt == RoomType::Wall)
        return false;


    m.MarkPath(x,y);

    if (FindPath(m,x,y-1) == true){
        return true;
    }

    if (FindPath(m,x+1,y) == true){
        return true;
    }

    if (FindPath(m,x,y+1) == true){
        return true;
    }

    if (FindPath(m,x-1,y) == true){
        return true;
    }

    m.ClearPath(x,y);
    return false;
}

【问题讨论】:

  • 将其标记为 C++。由于故障不在此代码中。为什么不试试调试器
  • 你似乎没有避免踩到标记的路径,这会导致无限递归
  • “[T]这应该可以。”成功调试的第一步是从你的脑海中抹去这个想法。它不起作用是有原因的——你只需要找到。

标签: c++ c++11 segmentation-fault maze


【解决方案1】:

FindPath() 似乎并没有避免重复进入同一个房间,这很容易导致测试路径中的循环。例如,它会尝试在两个相邻的房间之间无限地反复前进和后退。

这导致越来越深的递归,最终导致堆栈溢出。这是堆栈溢出可能是分段的原因。

【讨论】:

    【解决方案2】:

    您需要检查 x 和 y 是否在函数顶部的范围内,这应该可以解决您的崩溃问题。

    【讨论】:

    • 路径标记可能也是为了避免多次尝试相同的事情
    • 不,我认为他用来标记正确的路径,因为没有像 x,y 标记那样的逻辑,然后返回。
    • 它缺少可能是真正的错误的检查,边界检查似乎已经存在(RoomType::Outside)
    • 这取决于他如何实现GetRoomType。如果他正在做 m.rooms[x][y].type 或其他什么,那么它会崩溃。如果他在该函数内部进行边界检查并在 x 和 y 超出范围时返回外部,那么它确实会处理它。您是对的,需要检查标记的路径并且不要再次遍历,否则它将导致无限循环导致堆栈深度超过不撞墙的圆形路径的最大值。所以他可能会在段错误解决后遇到这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-12-11
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2013-12-05
    • 2019-03-18
    相关资源
    最近更新 更多