GESP6级C++考试语法知识(二十六、广度优先搜索(一、认识BFS))
第一课《消息传播城——认识广度优先搜索 BFS》一、故事开始国王的紧急消息1、很久很久以前有一座叫「消息传播城」的大王国。2、有一天怪兽突然来袭国王必须立刻通知所有村庄“马上准备防御”3、可是问题来了王国太大了到底该怎么传消息最快呢二、两种不同的传消息方法国王找来了两位骑士。1、第一位DFS 骑士深度优先搜索1DFS 骑士特别执着。他会一条路冲到底2比如A → B → C → D走到头了才回来换路。3DFS 像什么像一根树枝爬到底这个方法我们前面课程已经学过了。2、️第二位BFS 骑士今天的新主角1BFS 骑士完全不同他会先通知离自己最近的所有人2然后这些人再继续通知别人。3就像水波扩散三、什么叫“广度优先”1、假设国王在村庄 A。2、A 能通知B、C、D然后B、C、D 再继续通知别人。3、于是传播顺序变成第一层A 第二层B C D 第三层E F G H 第四层……4、你发现了吗BFS 不是一条路走到底而是一圈一圈扩散四、BFS 为什么必须用队列这里就是今天最重要的地方1、我们前面已经学过队列Queue特点是先进先出FIFO2、例如排队买冰淇淋小明 → 小红 → 小刚谁先来谁先买。3、而 BFS 正需要这种规则因为谁先收到消息谁就应该先继续传播4、所以BFS 队列 扩散五、先看一个最简单的 BFS 游戏1、游戏规则数字跳跃你现在站在数字1目标是到达102、每次你可以1 或者 -13、问最少几步到达 10六、如果用 DFS 会怎样1、DFS 会1 → 2 → 3 → 4 → ……一直冲到达了。2、但是有时也会1 → 0 → -1 → -2跑偏了3、DFS 不擅长“最少步数”七、BFS 如何思考1、BFS 会这样2、第0层13、第1层一步能到0 24、第2层两步能到-1 1 1 3注意重复的数字不用再进入。5、第3层-2 0 2 4……6、最终第一次到达 10。7、为什么一定最短因为BFS 是按层扩散的8、第1次到达一定是最少步数八、visited 数组为什么重要1、这里是初学者最容易犯错的地方2、假设没有 visited。那么1 → 2 → 1 → 2 → 1 → 2会无限循环3、所以我们必须记录哪些位置已经来过。4、visited 的作用vis[x]表示x 是否访问过九、BFS 的完整流程BFS 四步法第一步起点进入队列q.push(start);第二步标记访问vis[start] true;第三步取出队头int x q.front(); q.pop();第四步扩展新位置把能到的新位置加入队列。十、第一份 BFS 程序1、题目从 1 走到 10。每次1-1求最少步数。2、参考程序#include iostream #include queue using namespace std; struct Node { int x; // 当前数字 int step; // 已经走了多少步 }; int main() { queueNode q; bool vis[100] {0}; // 起点入队 q.push({1, 0}); vis[1] true; while(!q.empty()) { // 取出队头 Node cur q.front(); q.pop(); // 到达终点 if(cur.x 10) { cout 最少步数 cur.step endl; break; } // 两种移动方式 int next1 cur.x 1; int next2 cur.x - 1; // 尝试 next1 if(next1 0 next1 20 !vis[next1]) { vis[next1] true; q.push({next1, cur.step 1}); } // 尝试 next2 if(next2 0 next2 20 !vis[next2]) { vis[next2] true; q.push({next2, cur.step 1}); } } return 0; }十一、程序执行过程1、初始队列 (1,0)2、取出13、加入0 24、再取出0继续扩展……5、像不像水波一圈圈扩散十二、BFS 和 DFS 的真正区别搜索方式像什么使用什么特点DFS一条路走到底栈/递归适合遍历BFS水波扩散队列擅长最短路十三、什么时候想到 BFS以后看到1、扩散病毒传播火焰蔓延消息通知2、️最少步数最少移动最短路径最少操作3、按层搜索一圈一圈找。4、就要想到BFS⚔️十四、课堂挑战题 ⚔️1、挑战1从3 → 15每次可以2 -1最少几步2、挑战2从5 → 17每次可以×2 1最少几步十五、本课最终总结1、BFS 的核心一圈一圈扩散2、BFS 要使用队列 Queue3、第一次到达终点一定最短4、visited 必不可少防止无限循环今天我们真正学会的不只是代码。而是BFS“层层扩散”的思维。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2640951.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!