• 奇怪的电梯


    问题 Y: 奇怪的电梯

    时间限制: 1 Sec  内存限制: 64 MB

    题目描述

    有一天桐桐做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K;(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki (K1=3,K2=3,…),从一楼开始。在一楼,按“上,”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?

    输入

    第1行为三个正整数,表示N,A,B(1≤N≤200,1≤A,B≤N);
    第2行为N个正整数,表示Ki。

    输出

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

    样例输入

    5 1 5
    3 3 1 2 5
    
    

    样例输出

    3
    

    提示

    上述答案得到方式如下:
    从1楼按上,上到4楼
    在4楼按下,到达2楼
    在2楼按上,到达5楼
    共3步

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n,a,b;
    int f[210];
    int ans=0x7ffffff;
    int vis[210];
    
    void dfs(int now,int times)
    {
        if(times>n)
            return;
        if(now==b)
        {
            ans = min(ans,times);
    
        }
        else if(times<=ans)
        {
            vis[now] = 1;
            if(now-f[now]>=1&&!vis[now-f[now]])
            {
               // vis[now-f[now]] = 1;
                dfs(now-f[now],times+1);
               // vis[now-f[now]]=0;
            }
            if(now+f[now]<=n&&!vis[now+f[now]])
            {
                //vis[now+f[now]] = 1;
                dfs(now+f[now],times+1);
                //vis[now-f[now]] = 0;
            }
            vis[now] = 0;
        }
    
    
    }
    int main()
    {
        cin>>n>>a>>b;
        for(int i=1;i<=n;i++)
        {
            cin>>f[i];
        }
        vis[a] = 1;
        dfs(a,0);
        if(ans!=0x7ffffff)
            cout<<ans;
        else
            cout<<-1;
        return 0;
    }

    //注释部分出错wa了很多发  状态的改变和回溯

    对于大佬们的水题

  • 相关阅读:
    模板复习
    [BZOJ4016][FJOI2014]最短路径树问题(dijkstra+点分治)
    Stirling数,Bell数,Catalan数,Bernoulli数
    [BZOJ2820]YY的GCD
    [BZOJ2154]Crash的数字表格
    [HAOI2011]Problem b&&[POI2007]Zap
    [BZOJ2588][SPOJ10628]Count on a tree
    [ONTAK2010]Peaks
    [HNOI2010]弹飞绵羊
    [HNOI2004]宠物收养所
  • 原文地址:https://www.cnblogs.com/hao-tian/p/9350766.html
Copyright © 2020-2023  润新知