题目大意
一栋楼有 n 层,要求从 A 层去 B 层; 知道每一层都有一个数字 x,表示能向上或向下移动 x 的间距; 求从 A 层 去 B 层的最短路。
题目分析
每层都有一个固定的数字 x ,其实就是步长,而且只能在(0,n ]的楼层内移动 经典的宽搜题目
解题思路:
用一个队列存储“下一次能到达的楼层”; 题目有个坑点,就是 0 数据
代码1:
//解题思路:
//1 经典宽搜,同“抓住那头牛”
//2 两个方向(上,下)
//3 考察队列的使用,无聊但是又实用的坑点 0
#include<cstdio>
int n,st,ed;
int a[210],f[210];
void bfs()
{
int tou=1,wei=2;
int l[210],t[210];//队列,步数
l[1]=st;t[1]=0;
while(tou<wei)
{
int x=l[tou];
int ax=x+a[x];//上
int bx=x-a[x];//下
if(ax==ed) { printf("%d",t[tou]+1);return ;}
if(bx==ed) { printf("%d",t[tou]+1);return ;}
if(!f[ax]&&ax>=1&&ax<=n) f[ax]=1,t[wei]=t[tou]+1,l[wei++]=ax;
if(!f[bx]&&bx>=1&&bx<=n) f[bx]=1,t[wei]=t[tou]+1,l[wei++]=bx;
tou++;
}
printf("-1");
}
int main()
{
scanf("%d %d %d",&n,&st,&ed);
if(st==ed) { printf("0");return 0; } //无聊,但是又实用的坑点
for(int i=1;i<=n;i++) scanf("%d",&a[i]),f[i]=0;
bfs();
return 0;
}