马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
题目
题解
每到一层楼都面临了两种选择:上照旧下?因此我们可以定义一个布尔数组用来记载选择。
停止条件着实也显着,要么到了B层,要么没有找到楼层。
如果找到了,选择一个步调少的方式。又怎么体现没有找到楼层?
定义一个答案res,把它定义很大,如果找到了答案,更新最小值即可。
int res=1e9;
res = min(res,cnt);
这着实都很简朴,关键在于怎么剪枝?
第一,找答案的过程中如果发现cnt>res,就可以剪掉了
第二,每一层尽大概只来一次,如果选择了雷同的选择。就斲丧了肯定的cnt,不可取。如果选择了差异的方式,没找到B层也还行,如果找到了,那我们第一次到这个楼层的时候就该选这个差异的方式,整个方案就已经没有须要再举行下去了。所以综上,再选择的时候我们应该一个楼层最多走一次。
答案
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 210;
- int n;
- int A,B;
- int K[N];
- int res = 1e9;
- bool st[N] = {false};
- void dfs(int x,int cnt)
- {
- if(cnt > res) return ;
- if(x == B)
- {
- res = min(res,cnt);
- return ;
- }
-
- if(x+K[x] <= n && !st[x+K[x]]){
- st[x] = true;
- dfs(x+K[x],cnt+1);
- st[x]=false;
- }
- if(x-K[x] > 0 && !st[x+K[x]])
- {
- st[x] = true;
- dfs(x-K[x],cnt+1);
- st[x] = false;
- }
-
- }
- int main()
- {
- cin >> n >> A >> B;
- for(int i = 1;i<=n;i++)
- {
- cin >> K[i];
- }
-
- st[A]=true;
- dfs(A,0);
- if(res == 1e9){
- cout << "-1";
- return 0;
- }
- cout << res;
- return 0;
- }
复制代码 |