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

求助:老鼠走迷宫问题代码出现Segmentation Fault错误

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

这是标准老鼠走迷宫问题:给定二进制网格,当grid[i][j]==0时表示路径阻塞,老鼠从(0,0)出发,需找出所有到达(n-1,n-1)单元格的路径。以下代码运行时出现Segmentation Fault(段错误),问题排查及修正如下:

原代码

class Solution{
    public:
    // vector<string>ans;
    // vector<pair<int,int>>dir={{0,1},{0,-1},{-1,0},{1,0}};
    // vector<string>move={"R","L","U","D"};
    void dfs(int i,int j,vector<vector<int>>&m,string 
    curr,vector<vector<int>>&visited,vector<pair<int,int>>dir,vector<string>move,vector<string>&ans){
            if(i==m.size()-1 and j==m.size()-1){
                ans.push_back(curr);
                return;
            }

    for(int z=0;z<dir.size();z++ ){
        int nx=i+dir[z].first;
        int ny=j+dir[z].second;
        if(visited[nx][ny]==0 and m[nx][ny]==1 and nx>=0 and nx<m.size() and ny>=0 and 
        ny<m.size() ){
             visited[nx][ny]=1;
             dfs(nx,ny,m,curr+move[z],visited,dir,move,ans);
             visited[nx][ny]=0;
        }    
    }
    
}
vector<string> findPath(vector<vector<int>> &m, int n) {
 vector<vector<int>>visited(m.size(),vector<int>(n,0));
 string curr="";
 vector<string>ans;
 vector<pair<int,int>>dir={{0,1},{0,-1},{-1,0},{1,0}};
 vector<string>move={"R","L","U","D"};
 dfs(0,0,m,curr,visited,dir,move,ans);
 return ans;   
}
};

错误原因

  • 边界检查顺序错误:代码先判断visited[nx][ny]==0和m[nx][ny]==1,再检查nx、ny是否在合法范围内。当nx或ny为负数/超出网格索引时,直接访问visited[nx][ny]会触发越界访问,导致段错误。必须先判断nx、ny是否在[0, n-1]范围内,再检查其他条件。
  • 起点未标记已访问:调用dfs前未将visited[0][0]设为1,也未判断起点m[0][0]是否为1。若起点阻塞,后续递归无意义;若起点未标记,递归中会重复访问起点,引发逻辑错误甚至越界。
  • 网格大小一致性问题:构造visited时行数用m.size()、列数用n,若传入的n与m的列数不一致,会导致visited尺寸错误,引发访问越界。题目是n阶网格,应统一用n初始化visited。

修正后的代码

class Solution{
public:
    void dfs(int i, int j, vector<vector<int>>& m, string curr, 
             vector<vector<int>>& visited, vector<pair<int,int>>& dir, 
             vector<string>& move, vector<string>& ans, int n){
        // 到达终点,记录路径
        if(i == n-1 && j == n-1){
            ans.push_back(curr);
            return;
        }

        for(int z=0; z<dir.size(); z++){
            int nx = i + dir[z].first;
            int ny = j + dir[z].second;
            // 先检查边界,再判断是否可走、未访问
            if(nx >= 0 && nx < n && ny >=0 && ny < n && m[nx][ny] == 1 && visited[nx][ny] == 0){
                visited[nx][ny] = 1;
                dfs(nx, ny, m, curr + move[z], visited, dir, move, ans, n);
                visited[nx][ny] = 0; // 回溯
            }
        }
    }

    vector<string> findPath(vector<vector<int>> &m, int n) {
        vector<string> ans;
        // 起点直接阻塞,返回空
        if(m[0][0] == 0) return ans;
        
        vector<vector<int>> visited(n, vector<int>(n, 0));
        vector<pair<int,int>> dir = {{0,1}, {0,-1}, {-1,0}, {1,0}};
        vector<string> move = {"R", "L", "U", "D"};
        visited[0][0] = 1; // 标记起点已访问
        dfs(0, 0, m, "", visited, dir, move, ans, n);
        return ans;
    }
};

内容的提问来源于stack exchange,提问作者ash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:09:21