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,直接导致程序崩溃无输出:
- 类成员初始化顺序错误:
N_rows、N_cols的初始化早于构造函数内对A的赋值,初始化时A为空vector,读取A.size()、A[0].size()属于非法访问。 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
相关产品推荐
相关产品推荐

