总结:
- queue队列的应用
- memeset函数的应用
BFS:
- 广度优先搜寻(breadth-fifirst searching,bfs),尽量广阔地搜寻,在每一步优先拜访间隔最近的结点。
- 因为BFS须要依照 接触到的程序 来拜访,所以须要一种先入先出的数据结构——队列来辅助实现。
- 当咱们搜寻一个结点时,将它所有的分支推入队列;解决完以后结点后,再从队列头取出下一个结点持续进行搜寻。
#include<bits/stdc++.h>using namespace std;/*思路: 5 1 5 楼层:1 2 3 4 5 按钮:3 3 1 2 5 将楼层A压入队列中,而后找非法的上下楼 压入队列 一直出队 入队 直到B出队就找到了 */const int MAXN = 205;int flr[MAXN]; //存储按钮 int dis[MAXN];//寄存按按钮次数int main(){ int n,a,b; cin>>n>>a>>b; for(int i = 1;i<=n;i++){ cin>>flr[i]; } memset(dis,-1,sizeof(dis)); //memset函数初始化只能是: 0,-1 ,0x3f dis[a]= 0; queue<int> q;//创立队列, int类型 q.push(a); //把a压入队列 while(!q.empty()){ //判断是否非空 int x = q.front(); //取第一个值,front 只是返回这个值,并没有把这个值入列 q.pop(); //出列 if(x == b){ cout<<dis[x]<<endl; return 0; //这里没有写break;输出后果之后间接完结了,间接return 0即可 } int y; //下一步达到的楼层 y = x-flr[x]; if(y>0 && dis[y]==-1){ //要判断这个楼层之前没有拜访过,不然会反复拜访 dis[y] = dis[x]+1; //达到y层须要的按键次数 q.push(y); //达到了之后要把y入队 持续下一轮的判断 } y = x+flr[x]; if(y<=n && dis[y]==-1){ dis[y] = dis[x]+1; q.push(y); } } cout<<-1<<endl;}