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

回溯法求解迷宫C++代码出现段错误问题求助

迷宫求解代码段错误的原因及修复方案

核心错误:数组越界访问

你的代码中所有方向判断的边界检查顺序错误,导致在访问数组元素之后才判断是否越界,直接触发段错误。例如:

if(maze[i][j + 1] == "1" && visited[i][j + 1] != "1" && j + 1 < maxCol)

当j处于最后一列(如示例中的j=9,maxCol=10),j+1=10已超出数组有效索引范围(列索引为0~9),但代码先访问了maze[i][j+1],这会直接访问非法内存,导致程序崩溃。

修复步骤

1. 调整边界检查顺序

所有方向判断必须先检查边界合法性,再访问数组元素,修正后的四个方向判断如下:

// 向右
if(j + 1 < maxCol && maze[i][j + 1] == "1" && visited[i][j + 1] != "1"){
    findPath(i, j + 1, maze, visited, endX, endY, maxRow, maxCol);
}
// 向下
if(i + 1 < maxRow && maze[i + 1][j] == "1" && visited[i + 1][j] != "1"){
    findPath(i + 1, j, maze, visited, endX, endY, maxRow, maxCol);
}
// 向左
if(j - 1 >= 0 && maze[i][j - 1] == "1" && visited[i][j - 1] != "1"){
    findPath(i, j - 1, maze, visited, endX, endY, maxRow, maxCol);
}
// 向上
if(i - 1 >= 0 && maze[i - 1][j] == "1" && visited[i][j - 1] != "1"){
    findPath(i - 1, j, maze, visited, endX, endY, maxRow, maxCol);
}

2. 初始化visited数组

visited数组默认是空字符串,虽逻辑上可判断,但显式初始化为"0"更安全,避免未知行为。在main函数中添加:

// 初始化visited数组为"0"
for(int i = 0; i < row; i++){
    for(int j = 0; j < col; j++){
        visited[i][j] = "0";
    }
}

3. 补充终点坐标输出

当前代码到达终点时直接return,未输出终点坐标,导致路径不完整。修改终点判断逻辑:

if(i == endX && j == endY){
    cout << i << " " << j << endl; // 输出终点坐标
    return;
}

4. 优化路径输出(可选)

当前代码进入函数就输出坐标,回溯时会重复输出无效路径点。改用路径栈记录当前路径,到达终点时再打印完整有效路径:

// 修改findPath函数,增加路径参数
void findPath(int i, int j, vector<vector<string>> &maze, vector<vector<string>> &visited, int endX, int endY, int maxRow, int maxCol, vector<pair<int, int>>& path){
    if(i == endX && j == endY){
        path.emplace_back(i, j);
        // 打印完整路径
        for(auto& p : path){
            cout << p.first << " " << p.second << endl;
        }
        path.pop_back();
        return;
    }
    if(visited[i][j] == "1") return; // 已访问过,直接返回

    visited[i][j] = "1";
    path.emplace_back(i, j);

    // 四个方向判断(已调整边界顺序)
    if(j + 1 < maxCol && maze[i][j + 1] == "1" && visited[i][j + 1] != "1"){
        findPath(i, j + 1, maze, visited, endX, endY, maxRow, maxCol, path);
    }
    if(i + 1 < maxRow && maze[i + 1][j] == "1" && visited[i + 1][j] != "1"){
        findPath(i + 1, j, maze, visited, endX, endY, maxRow, maxCol, path);
    }
    if(j - 1 >= 0 && maze[i][j - 1] == "1" && visited[i][j - 1] != "1"){
        findPath(i, j - 1, maze, visited, endX, endY, maxRow, maxCol, path);
    }
    if(i - 1 >= 0 && maze[i - 1][j] == "1" && visited[i][j - 1] != "1"){
        findPath(i - 1, j, maze, visited, endX, endY, maxRow, maxCol, path);
    }

    visited[i][j] = "0";
    path.pop_back();
}

// main函数中调用时新增路径容器
vector<pair<int, int>> path;
findPath(startX, startY, maze, visited, endX, endY, row, col, path);

修复后的完整代码

#include<bits/stdc++.h>
using namespace std;

void findPath(int i, int j, vector<vector<string>> &maze, vector<vector<string>> &visited, int endX, int endY, int maxRow, int maxCol, vector<pair<int, int>>& path){
    if(i == endX && j == endY){
        path.emplace_back(i, j);
        for(auto& p : path){
            cout << p.first << " " << p.second << endl;
        }
        path.pop_back();
        return;
    }
    if(visited[i][j] == "1") return;

    visited[i][j] = "1";
    path.emplace_back(i, j);

    if(j + 1 < maxCol && maze[i][j + 1] == "1" && visited[i][j + 1] != "1"){
        findPath(i, j + 1, maze, visited, endX, endY, maxRow, maxCol, path);
    }
    if(i + 1 < maxRow && maze[i + 1][j] == "1" && visited[i + 1][j] != "1"){
        findPath(i + 1, j, maze, visited, endX, endY, maxRow, maxCol, path);
    }
    if(j - 1 >= 0 && maze[i][j - 1] == "1" && visited[i][j - 1] != "1"){
        findPath(i, j - 1, maze, visited, endX, endY, maxRow, maxCol, path);
    }
    if(i - 1 >= 0 && maze[i - 1][j] == "1" && visited[i - 1][j] != "1"){
        findPath(i - 1, j, maze, visited, endX, endY, maxRow, maxCol, path);
    }

    visited[i][j] = "0";
    path.pop_back();
}

int main()
{
    freopen("input.txt", "r", stdin);

    int row, col;
    cin >> row >> col;
    
    vector<vector<string>> maze(row, vector<string>(col));
    vector<vector<string>> visited(row, vector<string>(col));

    // 初始化visited数组
    for(int i = 0; i < row; i++){
        for(int j = 0; j < col; j++){
            visited[i][j] = "0";
        }
    }

    for(int i = 0; i < row; i++){
        for(int j = 0; j < col; j++){
            cin >> maze[i][j];
        }
    }

    int startX, startY, endX, endY;
    for(int i = 0; i < row; i++){
        for(int j = 0; j < col; j++){
            if(maze[i][j] == "@"){
                startX = i;
                startY = j;
                maze[i][j] = "1";
            }
            if(maze[i][j] == "#"){
                endX = i;
                endY = j;
                maze[i][j] = "1";
            }
        }
    }

    vector<pair<int, int>> path;
    findPath(startX, startY, maze, visited, endX, endY, row, col, path);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:52:17