问题 Y: 奇怪的电梯
时间限制: 1 Sec 内存限制: 64 MB题目描述
有一天桐桐做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K;(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki (K1=3,K2=3,…),从一楼开始。在一楼,按“上,”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
输入
第1行为三个正整数,表示N,A,B(1≤N≤200,1≤A,B≤N);
第2行为N个正整数,表示Ki。
第2行为N个正整数,表示Ki。
输出
1行,即最少按键次数,若无法到达,则输出-1。
样例输入
5 1 5
3 3 1 2 5
样例输出
3
提示
上述答案得到方式如下:
从1楼按上,上到4楼
在4楼按下,到达2楼
在2楼按上,到达5楼
共3步
#include <bits/stdc++.h> using namespace std; int n,a,b; int f[210]; int ans=0x7ffffff; int vis[210]; void dfs(int now,int times) { if(times>n) return; if(now==b) { ans = min(ans,times); } else if(times<=ans) { vis[now] = 1; if(now-f[now]>=1&&!vis[now-f[now]]) { // vis[now-f[now]] = 1; dfs(now-f[now],times+1); // vis[now-f[now]]=0; } if(now+f[now]<=n&&!vis[now+f[now]]) { //vis[now+f[now]] = 1; dfs(now+f[now],times+1); //vis[now-f[now]] = 0; } vis[now] = 0; } } int main() { cin>>n>>a>>b; for(int i=1;i<=n;i++) { cin>>f[i]; } vis[a] = 1; dfs(a,0); if(ans!=0x7ffffff) cout<<ans; else cout<<-1; return 0; }
//注释部分出错wa了很多发 状态的改变和回溯
对于大佬们的水题