集训作业 洛谷P1135 奇怪的电梯

这个题我见过!!!

我之前在石油大学的网站上做练习赛,提高了很多,这个题是我第一次在比赛里见到深搜。

当时蒙蔽的一批,现在发现好简单……

这个题和普通的深搜没什么区别,甚至可以说简单了,因为这个是1维的,别的是二维的(见到老熟人,我快高兴疯了)。

我们先来个代码吧,解释什么的写进注释里了:

#include<iostream>
#include<cstdio>
using namespace std;
long long a,b,n;
long long k[300];
long long t,w,bj2=0;
long long sz[1000],bs[1000],bj[300];//不想用queue,就用数组了
void bfs()
{
	while(w<=t)
	{
		if(sz[w]==b)//到地方了,输出一下用了多少步
		{
			bj2=1;//是可以到达目的地的
			cout<<bs[w]<<endl;
			return;
		}
		if(sz[w]+k[sz[w]]<=n&&bj[sz[w]+k[sz[w]]]==0)//向上移动,并且到达的楼层没来过,而且不会飞出去。
		{
			t++;
			sz[t]=sz[w]+k[sz[w]];//加一个新楼层
			bs[t]=bs[w]+1;//来这层楼用了几步
			bj[sz[w]+k[sz[w]]]=1;//现在来过了
		}
		if(sz[w]-k[sz[w]]>=1&&bj[sz[w]-k[sz[w]]]==0)//向下移动,并且到达的楼层没来过,而且不会进入地下室
		{
			t++;
			sz[t]=sz[w]-k[sz[w]];//加进来一个新楼层
			bs[t]=bs[w]+1;//来这层楼用了几步
			bj[sz[w]-k[sz[w]]]=1;//现在来过了
		}
		w++;
	}
}
int main()
{
	scanf("%lld%lld%lld",&n,&a,&b);
	sz[t]=a;//初始在第a层
	bs[t]=0;//不需要移动
	bj[a]=1;//第a层来过了
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&k[i]);//输入
	}
	bfs();//搜索
	if(bj2==0)//如果到达不了目的地,输出-1;
	{
		cout<<-1<<endl;
	}
	return 0;	
}

是不是简单的不能再简单了,真是个良心题。

原文地址:https://www.cnblogs.com/lichangjian/p/12888686.html