BFS
宽搜算法
BFS适用于“知道初始状态、最终状态,要求与过程路径的相关解”的题目。
核心剖解
宽搜借助队列实现,类似于树结构的节点遍历。
从根节点开始,对每一个使用点都要在其父节点的循环中进行入队、设置访问vis[]操作(根节点的初始化要在循环外进行),检查当前节点的子节点中是否有退出点,有则终止遍历,没有就把子节点入队、设置访问。
对于一些需要记录过程状态的题目,还需要用另一个数组dis[]来进行状态转移。
bool vis[]; type dis[]; // 状态转移数组 inline bool isValid(node& v) { } // 边界检查函数 int bfs() { queue
q; node vc, vn; q.emplace(vc); vis[vc.x][vc.y] = 1; while (!q.empty()) { vc = q.front(); q.pop(); for (/*any rule*/) { vn.x = vc.x+……; // 按规则寻找子节点 vn.y = vc.y+……; if (isValid(vn) && !vis[vn.x][vn.y]) { // 子节点入队、访问 q.emplace(vn); vis[vn.x][vn.y] = 1; dis[vn.x][vn.y] = dis[vc.x][vc.y] + 1; // 记录状态 } if (vn==ed) return dis[ed.x][ed.y]; } } return -1; // 无结果 }