BFS入门
广度优先搜索相比于深度优先搜索,从形态上差异很明显,一个是先搜索到最深,一个是一层层的先把当前层的每一个都搜索到,顾名思义的话,就是这样子,也确实是这样子。
gw老师的广搜流程图,讲得真的好啊。。
我写这道题时想过:既然广搜是逐层搜索,记录当前进入到第几层了,然后搜索到终点时,直接输出层数就好了呀。而郭伟老师直接把队列的每一个单位都定义成结构体,在结构体里面储存“走到这个点走的步数”,我觉得真的好麻烦啊!于是我自己试了一下“记录层数”,最终找到终点时直接输出层数 的想法,然后发现,其实最终写出来跟郭伟老师差不多,哈哈哈哈哈哈
熟悉一下队列的使用:
#include<queue> struct node{ bool mark; int value; }; queue<node> str; str.push(node(true,25)); str.front(); str.empty(); str.back(); str.pop(); str.size();
ac代码:
#include<iostream> #include<queue> using namespace std; const int maxn=100000; struct node{ int x,step; node(int xx,int ss):x(xx),step(ss){} }; int visit[100010],b,e; queue<node> s; int main() { cin>>b>>e; s.push(node(b,0)); visit[b]=1; while(!s.empty()){ node t=s.front(); if(t.x==e){ cout<<t.step<<endl; return 0; } else{ if(t.x-1>=0 && !visit[t.x-1]){ s.push(node(t.x-1,t.step+1)); visit[t.x-1]=1; } if(t.x+1<=maxn && !visit[t.x+1]){ s.push(node(t.x+1,t.step+1)); visit[t.x+1]=1; } if(t.x*2<=maxn && !visit[t.x*2]){ s.push(node(t.x*2,t.step+1)); visit[t.x*2]=1; } s.pop(); } } return 0; }
下面是我自己实现的代码,注意判断时 要判断 2*n<100000 || n+1<100000 原因我相信你也懂,不然会runtime error
#include<iostream> #include<algorithm> #include<queue> using namespace std; const int maxn=100006; queue<int>q; int m,k; int visit[maxn]; int a[maxn]; void bfs(){ int n=q.front(); while(!q.empty()){ n=q.front(); if(n==k) return; q.pop(); if(n!=0 && !visit[n-1]){ q.push(n-1); visit[n-1]=1; a[n-1]=a[n]+1; } if(n+1<100001 && !visit[n+1]){ q.push(n+1); visit[n+1]=1; a[n+1]=a[n]+1; } if((2*n)<maxn && !visit[2*n]){ q.push(2*n); visit[2*n]=1; a[2*n]=a[n]+1; } } } int main(){ cin>>m>>k; q.push(m); visit[m]=1; bfs(); cout<<a[k]; return 0; }