C++-电梯 解题思路

【Horn Studio】编程专栏: 电梯  解题思路

题目

题目描述

小明所住的居民楼的电梯非常独特,楼房的每一层都可以停电梯,并且第i(1iN)i(1≤i≤N)层的电梯上有一个数字Ki(0KiN)Ki(0≤Ki≤N)。电梯上只有两个按钮:上、下。如果在第ii层按上,那么电梯会去到i+Kii+Ki楼(当然i+Kii+Ki必须要小于等于NN,否则电梯不会动);如果在ii层按下,那么电梯会去到iKii−Ki楼(当然iKii−Ki必须要大于等于11,否则电梯不会动);当然你也可以选择不按按钮。那么从AA层到BB层最少要按几次按钮呢?

输入

第一行三个数字表示N,A,BN,A,B。

第二行NN个数字,第ii个数字表示KiKi。

输出

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

样例输入 复制

5 1 5
3 3 1 2 5

样例输出 复制

3

提示

所有数据满足:1N200,1A,BN1≤N≤200,1≤A,B≤N。

思路

一道比较好的搜索题,dfs的话要略微剪枝,bfs应该就不用担心了

(我才不会告诉你bfs写不出来呢)

然而题目还是比较简单

可是我感觉自己的智商余额已经为0了

 

 

因此,我们就使用dfs来解答,虽然同为暴力算法,但又有那么一点不同……

很容易发现实际上就是找最短路,#对于边权(即路径长度)的值可以抽象为每次增加的操作数,即均为1,好主意!

我们使用爆搜+最短路径,代码量又少又好理解。

代码

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int n,a,b,ans=0x7ffffff;
 5 int to[205];
 6 bool vis[205];
 7 void dfs(int now,int sum)
 8 {
 9     if(now==b) ans=min(ans,sum);
10     if(sum>ans) return;
11     vis[now]=1;
12     if(now+to[now]<=n&&!vis[now+to[now]]) dfs(now+to[now],sum+1);
13     if(now-to[now]>=1&&!vis[now-to[now]]) dfs(now-to[now],sum+1);
14     vis[now]=0;
15 }
16 int main()
17 {
18     scanf("%d%d%d",&n,&a,&b);
19     for(int i=1;i<=n;i++) scanf("%d",&to[i]);
20     vis[a]=1;
21     dfs(a,0);
22     if(ans!=0x7ffffff) printf("%d",ans);
23     else printf("-1");
24     return 0;
25 }

彩蛋

洛谷老黄历逼得我关了电脑……额……我用手机写博客!

 

posted @ 2022-04-09 21:55  冯子坤  阅读(209)  评论(0编辑  收藏  举报