求助:老鼠走迷宫问题代码出现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
相关产品推荐
相关产品推荐

