杭电 1548 A strange lift

题目大意

 解题思路

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]。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值