题目大意
解题思路
BFS的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。
BFS的基本思路:
1、 创建一个visit数组,用来记录已被访问过的顶点;创建一个queue队列,用来存放每一层的顶点;初始化图G。
2、从图中的k[1]开始访问,将visit[1]数组的值设置为1,同时将k[1]入队。
3、若队列不空,则重复如下操作:
(1) 队列顶点cur出队。
(2)依次检查cur的所有邻接顶点nex,如果visit[nex]的值为0,则将visit[nex]的值设置为 1,并将nex入队。
代码实现
#include<bits/stdc++.h>
using namespace std;
int N,a,b,k[205],visit[205];
struct pos
{
int l;
int s;
};
void bfs()
{
pos cur,nex;
cur.l=a;
cur.s=0;
queue<pos>qu; //创建一个queue队列,用来存放每一层的顶点
qu.push(cur);
visit[a]=1;
while(!qu.empty())
{
cur=qu.front();
qu.pop(); //队列顶点cur出队
if(cur.l==b)
{
cout<<cur.s <<endl;
return;
} //如果电梯到达目的楼层,停止
nex.l =cur.l+k[cur.l];
nex.s=cur.s +1; //访问一个邻接顶点
if(nex.l<=N)
{
if(visit[nex.l]==0)
{
visit[nex.l]=1;
qu.push(nex);
}
}
nex.l =cur.l-k[cur.l];
nex.s=cur.s+1; //访问另一个邻接顶点
if(nex.l>=1)
{
if(visit[nex.l ]==0)
{
visit[nex.l]=1;
qu.push(nex);
}
}
}
cout<<"-1"<<endl; //在循环过程中没有达到目的楼层,则以输出-1结束
return ;
}
int main()
{
while(cin>>N)
{
if(!N)
break;
cin>>a>>b;
for(int i=1;i<=N;i++)
{
cin>>k[i];
visit[i]=0; //创建一个visit数组,用来记录已被访问过的顶点
}
bfs(); //调用bfs函数
}
return 0;
}
bug
WA 创建的图是从k[1]开始,不是k[0]。