You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现老鼠走迷宫触发SEGMENTATION FAULT 求调试指导

老鼠走迷宫代码段错误排查与修复

核心错误点

直接触发段错误的原因有3个,按影响优先级排序:

  • 边界检查顺序错误:当前代码进入递归后,先执行m[i][j]的数组访问,之后才判断i、j是否越界。当递归传入的i/j为负数、等于n时,访问数组越界位置会直接触发内存访问错误,这是段错误的最主要诱因。
  • 无已访问节点标记,递归死循环栈溢出:代码没有记录已经走过的迷宫格子,递归时会在相邻两个可走格子之间来回跳转(比如从(0,0)走到(1,0)后又向上走回(0,0)),无限递归会耗尽栈内存,同样触发段错误。
  • 字符串回溯逻辑错误:当前代码在每个方向分支外无条件执行x.pop_back(),如果对应方向的判断不成立、没有向x追加方向字符,pop操作会操作长度不足的字符串,属于未定义行为,可能引发内存错误。另外代码中残留了无匹配开头的*/注释符,会直接触发编译错误。

调试修复方向

按以下顺序修改即可解决问题:

  1. 调整递归函数内的判断顺序:进入函数第一时间做边界校验,确认i、j都在[0, n-1]合法区间后,再访问m数组的对应位置。
  2. 新增和迷宫等大的visited二维布尔数组,进入某个合法格子后先标记为已访问,当前格子四个方向都递归完成、准备回溯返回前,再把标记清除为未访问,避免重复走同一个格子进入死循环。
  3. 修正字符串回溯逻辑:每个方向的字符追加、递归调用、pop操作必须绑定在同一个分支内,只有确实追加了字符,递归返回后才执行对应pop,不要在分支外做无条件pop。
  4. 删除代码中残留的多余*/符号,修正语法错误。
  5. 额外注意:递归启动前先判断起点m[0][0]是否为0,如果起点不可走直接返回{"-1"}即可,不需要进入递归。

修正后的核心递归逻辑参考

class Solution{
    public:
    string x="";
    void rat(vector<vector<int>>&m,int n,vector<string>&ans,int i,int j, vector<vector<bool>>& visited)
    {
        // 最先执行边界校验,禁止越界访问
        if(i<0 || j<0 || i>=n || j>=n) return;
        // 校验当前格子是否可走、是否已经访问过
        if(m[i][j] == 0 || visited[i][j]) return;
        // 到达终点,存储路径
        if(i == n-1 && j == n-1)
        {
            ans.push_back(x);
            return;
        }
        // 标记当前格子已访问
        visited[i][j] = true;

        // 向下探索
        x.push_back('D');
        rat(m, n, ans, i+1, j, visited);
        x.pop_back();

        // 向右探索
        x.push_back('R');
        rat(m, n, ans, i, j+1, visited);
        x.pop_back();

        // 向上探索
        x.push_back('U');
        rat(m, n, ans, i-1, j, visited);
        x.pop_back();

        // 向左探索
        x.push_back('L');
        rat(m, n, ans, i, j-1, visited);
        x.pop_back();

        // 回溯:清除当前格子的访问标记
        visited[i][j] = false;
    }
    vector<string> findPath(vector<vector<int>> &m, int n) {
        vector<string> ans;
        // 起点不可走直接返回
        if(m[0][0] == 0) return {"-1"};
        vector<vector<bool>> visited(n, vector<bool>(n, false));
        rat(m, n, ans, 0, 0, visited);
        if(ans.empty()) return {"-1"};
        return ans;
    }
};

内容的提问来源于stack exchange,提问作者19ECE1012 Grishma Karekar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:06:21