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

C++实现BFS网格寻路代码无输出及bits/stdc++.h报错求解

问题描述

使用C++编写网格场景下的BFS目标单元格查找算法时,代码运行后无任何输出(仅显示空白)。代码逻辑和公开的标准BFS实现一致,无法定位故障点。
相关结构说明:

  • grid_graph类:用于声明网格图结构,底层为二维数组,0代表可通行路径,1代表障碍物
  • pathfinder方法:基于广度优先搜索实现的路径查找方法
  • neighbour_adder方法:配套辅助函数,用于搜索过程中添加邻接节点

原始故障代码:

#include<iostream>
#include <bits/stdc++.h>
using namespace std ;
class grid_graph{
    public:
    vector<vector<int>> A;
    grid_graph(vector<vector<int>> a){
        A = a;
    }
    int N_rows = A.size();
    int N_cols = A[0].size();
    
    void pathfinder(int src_r,int src_c,int dest_r,int dest_c);
    void neighbour_adder(int r,int c,queue<int>& R,queue<int>& C,vector<vector<bool>>& visited);
};
void grid_graph::pathfinder(int src_r,int src_c,int dest_r,int dest_c){
    queue<int> R;
    queue<int> C;
    R.push(src_r);
    C.push(src_c);
    vector<vector<bool>> visited;
    for(int i=0; i<N_rows; i++){
        for(int j=0; j<N_cols; j++){
            visited[i][j]=false;
        }
    }
    while(!R.empty()){
        cout<<R.front()<<" "<<C.front()<<endl;
        if(R.front()==dest_r && C.front()==dest_c){
            cout<<"reached"<<endl;
        }
        visited[R.front()][C.front()]=true;
        neighbour_adder(R.front(),C.front(),R,C,visited);
        R.pop();
        C.pop();
    }
}
void grid_graph::neighbour_adder(int r,int c,queue<int>& R,queue<int>& C,vector<vector<bool>>& visited){
    // 仅允许上下左右四方向移动
    int d1[4] = {0,0,+1,-1};
    int d2[4] = {+1,-1,0,0};
    for(int i=0; i<4; i++){
        int r_next = r + d1[i];
        int c_next = c + d2[i];
        if(r_next<0 || c_next<0 || r_next>=N_rows || c_next>=N_cols){
            continue;
        }
        // 1为障碍物,0为可通行区域
        if(A[r_next][c_next]==1 || visited[r_next][c_next]==true){
            continue;
        }
        R.push(r_next);
        C.push(c_next);
    }

}

int main(){
    
    grid_graph g2( {{ 0, 0, 0 },
                    { 0, 1, 0 },
                    { 0, 0, 0 } });
    g2.pathfinder(0,0,2,2);
    return 0;
}
故障原因

代码存在两个会触发未定义行为的bug,直接导致程序崩溃无输出:

  1. 类成员初始化顺序错误:N_rows、N_cols的初始化早于构造函数内对A的赋值,初始化时A为空vector,读取A.size()、A[0].size()属于非法访问。
  2. visited二维vector仅声明未分配内存空间,直接通过下标访问写入数据属于越界访问。
修复后可运行代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

class grid_graph{
    public:
    vector<vector<int>> A;
    // 使用初始化列表给A赋值,避免初始化顺序问题
    grid_graph(vector<vector<int>> a): A(a){}

    int colCount() const
    {
        return A[0].size();
    }
    int rowCount() const
    {
        return A.size();
    }

    void pathfinder(int src_r,int src_c,int dest_r,int dest_c);
    void neighbour_adder(int r,int c,queue<int>& R,queue<int>& C,vector<vector<bool>>& visited);
};
void grid_graph::pathfinder(int src_r,int src_c,int dest_r,int dest_c){
    queue<int> R;
    queue<int> C;
    R.push(src_r);
    C.push(src_c);

    int N_rows = rowCount();
    int N_cols = colCount();
    // 初始化时直接分配visited数组空间并赋初值
    vector<vector<bool> > visited(N_rows,vector<bool>(N_cols, false));

    while(!R.empty()){
        if(R.front()==dest_r && C.front()==dest_c){
            cout<<"reached"<<endl;
        }
        visited[R.front()][C.front()]=true;
        neighbour_adder(R.front(),C.front(),R,C,visited);
        R.pop();
        C.pop();
    }
}
void grid_graph::neighbour_adder(int r,int c,queue<int>& R,queue<int>& C,vector<vector<bool>>& visited){
    // 仅允许上下左右四方向移动
    int d1[4] = {0,0,+1,-1};
    int d2[4] = {+1,-1,0,0};
    int N_rows = rowCount();
    int N_cols = colCount();
    for(int i=0; i<4; i++){
        int r_next = r + d1[i];
        int c_next = c + d2[i];
        if(r_next<0 || c_next<0 || r_next>=N_rows || c_next>=N_cols){
            continue;
        }
        // 1为障碍物,0为可通行区域
        if(A[r_next][c_next]==1 || visited[r_next][c_next]==true){
            continue;
        }
        R.push(r_next);
        C.push(c_next);
    }

}

/*
补充说明:
Dijkstra算法是用于非负权图最短路径求解的贪心算法,常见实现包含惰性删除版、积极优化版、d叉堆优化版、斐波那契堆优化版。
拓扑排序基于DFS实现:遍历所有未访问节点,逆序存入结果数组即可,仅适用于有向无环图(DAG)。
*/

int main(){
    grid_graph g2( {{ 0, 0, 0 },
                    { 0, 1, 0 },
                    { 0, 0, 0 } });
    g2.pathfinder(0,0,2,2);

    return 0;
}
VS Code下bits/stdc++.h找不到的解决方案
  • 原因说明:bits/stdc++.h是GCC编译器专属的非标准万能头文件,MSVC(Visual Studio自带编译套件)不提供该头文件;如果使用MinGW但环境变量、VS Code配置路径错误,也会触发该报错。
  • 方案一(兼容性最优):放弃使用万能头,按需引入代码需要的标准头文件即可。上述BFS代码仅需引入<iostream>、<vector>、<queue>三个标准头,跨编译器、跨平台均可正常编译。
  • 方案二(保留万能头用法):将VS Code使用的C++编译器切换为配置正确的MinGW-w64版本,确认MinGW的bin目录已添加到系统PATH环境变量,在项目.vscode/c_cpp_properties.json配置文件中将编译器路径指向MinGW目录下的g++.exe即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:21:30