• hpu积分赛(回溯法)


    问题 : 不开心的小明①

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

    提交: 2 解决: 1

    题目描述

    一天, 小明很不开心,先是向女神表白被拒, 数学又考了0分, 回家的路上又丢了钥匙, 他非常的不开心。小明转了一圈又一圈感觉很无聊, 突然他眼前一亮准备乘电梯去b层楼打台球。假设小明现在在a层, 并且每层电梯有上下两个操作。

    输入

    有t组测试数据,每组数据占两行,第一行有三个整数n、a、b。

    n代表楼层数目编号从1-n,第二行有n个数a[],a[i]表示在第i层可以到达第i + a[i]层或者第i - a[i]层。

    0<n,a,b<100

    输出

    求最少按几次按钮,不开心的小明就可以从a层到达b层。

    若无法到达,输出-1。

    样例输入

    3
    5 1 5
    3 3 1 2 5
    17 13 14
    7 41 17 27 32 9 45 40 27 24 38 39 19 33 30 42 34
    6 1 6
    2 4 1 1 1 1
    

    样例输出

    3
    -1
    3
    
    dfs加回溯,最近很少写dfs回溯题目有些思维江化了233333
    第一次爆搜发现没开vis数组会无限搜索,开了之后WA才意识到要回溯才可,真是老了= =

    #include<bits/stdc++.h>
    using namespace std;
    int h[1005],n,counts;
    bool vis[1005];
    void dfs(int a,int b,int c)
    {
    if(a==b) {counts=min(counts,c);return;}
    int up=a+h[a],down=a-h[a];
    //cout<<up<<" "<<down<<endl;
    if(up<=n&&!vis[up]) {vis[up]=1;dfs(up,b,c+1);vis[up]=0;}                      //每次走的时候标记,走完后取消标记,避免影响到向下走时搜索的结果!
    if(down>=1&&!vis[down]) {vis[down]=1;dfs(down,b,c+1);vis[down]=0;}
    }
    int main()
    {
    int i,j,k,t,m,a,b;
    cin>>t;
    while(t--){counts=999999999;
    memset(vis,0,sizeof(vis));
    cin>>n>>a>>b;
    for(i=1;i<=n;++i) cin>>h[i];
    //if(a==b) {cout<<0<<endl;continue;}
    dfs(a,b,0);
    if(counts!=999999999) cout<<counts<<endl;
    else cout<<-1<<endl;
    }
    return 0;
    }

  • 相关阅读:
    BTree B+Tree
    SpringMvc框架 解决在RESTFUL接口后加任意 “.xxx” 绕过权限的问题
    多线程基础知识---sleep和wait区别
    多线程基础知识---join方法
    Maven跳过单元测试的两种方式
    maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令
    Maven项目版本继承 – 我必须指定父版本?
    SpringMVC 零配置 无web.xml
    利用ApplicationContextAware装配Bean
    Spring Boot 读取 resource 下文件
  • 原文地址:https://www.cnblogs.com/zzqc/p/6681997.html
Copyright © 2020-2023  润新知