电梯

题目

题目描述

小明所住的居民楼的电梯非常独特,楼房的每一层都可以停电梯,并且第i(1≤i≤N)层的电梯上有一个数字Ki(0≤Ki≤N)。电梯上只有两个按钮:上、下。如果在第i层按上,那么电梯会去到i+Ki楼(当然i+Ki必须要小于等于N,否则电梯不会动);如果在i层按下,那么电梯会去到i−Ki楼(当然i−Ki必须要大于等于1,否则电梯不会动);当然你也可以选择不按按钮。那么从A层到B层最少要按几次按钮呢?

输入

第一行三个数字表示N,A,B。

第二行N个数字,第i个数字表示Ki。

输出

一行,即最少按键次数,若无法到达,则输出−1。

样例输入

5 1 5
3 3 1 2 5

样例输出

3

思路

题目还是比较简单

我们使用dfs来解答,很容易发现实际上就是找最短路,路径长度的值可以抽象为每次增加的操作数,即均为1。

代码

#include<cstdio>
#include<iostream>
using namespace std;
int n,a,b,ans=0x7ffffff;
int to[205];
bool vis[205];
void dfs(int now,int sum)
{
    if(now==b) ans=min(ans,sum);
    if(sum>ans) return;
    vis[now]=1;
    if(now+to[now]<=n&&!vis[now+to[now]]) dfs(now+to[now],sum+1);
    if(now-to[now]>=1&&!vis[now-to[now]]) dfs(now-to[now],sum+1);
    vis[now]=0;
}
int main(){
    scanf("%d%d%d",&n,&a,&b);
    for(int i=1;i<=n;i++) scanf("%d",&to[i]);
    vis[a]=1;
    dfs(a,0);
    if(ans!=0x7ffffff) printf("%d",ans);
    else printf("-1");
    return 0;
}

小编蒟蒻一个,有什么问题请大佬不惜赐教Orz

posted @ 2022-04-15 20:53  骆美辰  阅读(53)  评论(0编辑  收藏  举报
lock: { enable: true, background: 'https://img1.baidu.com/it/u=2788089125,168843488&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1690563600&t=35fa4326e773b3fbf83562ad746b7cd2',//锁屏背景 strings: [ 'Every win named never give up 每一份胜利都叫不放弃',//签名 ], },