电梯里的BFS

电梯里的BFS

在这里插入图片描述
**
样例输入
5 1 5
3 3 1 2 5
0
样例输出
3
**

#include<iostream>
#include<queue>
using namespace std; 
int main()
{
	int N,A,B,t;//t用来标记样例的组数 
	int k[210];
	int flag[100001];//到达的最少步数 
	queue<int> q;
	cin>>N;
	while(N)
	{
		cin>>A>>B;
		for(int i=1;i<=N;i++)
		{
			cin>>k[i];//每一层按按钮之后移动的层数
			flag[i]=-1;//用来标记是否到达过
		}
		flag[A]=0;//从a开始,所以是0 
		q.push(A);
    	while(!q.empty())
    	{
        	int p=q.front();
			//cout<<b<<"  "; 
        	q.pop();//取队首的层数作为当前层数 
        	if(p==B)//层数到达 
        		break; 
        	if(p+k[p]<=N&&flag[p+k[p]]==-1)//判断上升时是否到达过并且越界 
        	{
            	flag[p+k[p]]=flag[p]+1;
            	q.push(p+k[p]);
        	}
        	//cout<<"hi";
        	if(p-k[p]>=1&&flag[p-k[p]]==-1)//判断下降时是否到达过并且越界
        	{
            	flag[p-k[p]]=flag[p]+1;
            	q.push(p-k[p]);
        	}
    	}
    	cin>>N;
    	cout<<flag[B]<<endl;//没到达输出-1
    	while(!q.empty())
    		q.pop();
		

	}
	
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值