奇怪的电梯——DFS算法

[复制链接]
发表于 2025-9-24 08:10:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
题目



题解

每到一层楼都面临了两种选择:上照旧下?因此我们可以定义一个布尔数组用来记载选择。
停止条件着实也显着,要么到了B层,要么没有找到楼层。
如果找到了,选择一个步调少的方式。又怎么体现没有找到楼层?
定义一个答案res,把它定义很大,如果找到了答案,更新最小值即可。
int res=1e9;
res = min(res,cnt);
这着实都很简朴,关键在于怎么剪枝?
第一,找答案的过程中如果发现cnt>res,就可以剪掉了
第二,每一层尽大概只来一次,如果选择了雷同的选择。就斲丧了肯定的cnt,不可取。如果选择了差异的方式,没找到B层也还行,如果找到了,那我们第一次到这个楼层的时候就该选这个差异的方式,整个方案就已经没有须要再举行下去了。所以综上,再选择的时候我们应该一个楼层最多走一次。
答案
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 210;
  4. int n;
  5. int A,B;
  6. int K[N];
  7. int res = 1e9;
  8. bool st[N] = {false};
  9. void dfs(int x,int cnt)
  10. {
  11.         if(cnt > res) return ;
  12.         if(x == B)
  13.         {
  14.                 res = min(res,cnt);
  15.                 return ;
  16.         }
  17.        
  18.         if(x+K[x] <= n && !st[x+K[x]]){
  19.                 st[x] = true;
  20.                 dfs(x+K[x],cnt+1);
  21.                 st[x]=false;
  22.         }
  23.         if(x-K[x] > 0 && !st[x+K[x]])
  24.         {
  25.                 st[x] = true;
  26.                 dfs(x-K[x],cnt+1);
  27.                 st[x] = false;
  28.         }
  29.        
  30. }
  31. int main()
  32. {
  33.         cin >> n >> A >> B;
  34.         for(int i = 1;i<=n;i++)
  35.         {
  36.                 cin >> K[i];
  37.         }
  38.        
  39.         st[A]=true;
  40.         dfs(A,0);
  41.         if(res == 1e9){
  42.                 cout << "-1";
  43.                 return 0;
  44.         }
  45.         cout << res;
  46.         return 0;
  47. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表