zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    54. 八皇后问题[eight queens puzzle]
    53. 特殊的O(n)时间排序[sort ages with hashtable]
    52. 不用+、-、×、÷做加法[add two numbers without arithmetic]
    C++基础知识面试精选100题系列(11-20题)[C++ basics]
    C++基础知识面试精选100题系列(1-10题)[C++ basics]
    洛谷 P1479 宿舍里的故事之五子棋
    洛谷 P2084 进制转换
    codevs 1700 施工方案第二季
    POJ 3278 Catch That Cow(求助大佬)
    POJ 2251 Dungeon Master
  • 原文地址:https://www.cnblogs.com/zzqc/p/6681997.html
Copyright © 2011-2022 走看看