C++-电梯 解题思路
【Horn Studio】编程专栏: 电梯 解题思路
题目
题目描述
小明所住的居民楼的电梯非常独特,楼房的每一层都可以停电梯,并且第i(1≤i≤N)i(1≤i≤N)层的电梯上有一个数字Ki(0≤Ki≤N)Ki(0≤Ki≤N)。电梯上只有两个按钮:上、下。如果在第ii层按上,那么电梯会去到i+Kii+Ki楼(当然i+Kii+Ki必须要小于等于NN,否则电梯不会动);如果在ii层按下,那么电梯会去到i−Kii−Ki楼(当然i−Kii−Ki必须要大于等于11,否则电梯不会动);当然你也可以选择不按按钮。那么从AA层到BB层最少要按几次按钮呢?
输入
第一行三个数字表示N,A,BN,A,B。
第二行NN个数字,第ii个数字表示KiKi。
第二行NN个数字,第ii个数字表示KiKi。
输出
一行,即最少按键次数,若无法到达,则输出−1−1。
样例输入 复制
5 1 5
3 3 1 2 5
样例输出 复制
3
提示
所有数据满足:1≤N≤200,1≤A,B≤N1≤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 }
彩蛋
洛谷老黄历逼得我关了电脑……额……我用手机写博客!