【题目描述】
大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)
。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
【输入】
共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。
【输出】
一行,即最少按键次数,若无法到达,则输出-1。
【输入样例】
复制代码
1
2
35 1 5 3 3 1 2 5
【输出样例】
复制代码
1
23
这题看起来比普通的DFS要难一些其实也差不多,你看哈:
5 |
---|
2 |
1 |
3 |
3 |
我不论在哪一楼,都只有两种走法,一种是上升,一种是向下降,和其他的DFS是一样的,例如样例,我在1楼,要去5楼,就只能向上走,到达4楼,因为没有-2楼,所以不可向下走,在4楼,又只能向下走,就到了2楼,因为没有6楼,在2楼,又只能向上走,到达5楼,因为没有-1楼,于是样例就是这样。
说了这么多应该明白了,下面看代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42#include<bits/stdc++.h> using namespace std; int n,a[208],q,z,ans=INT_MAX; bool ok[208]; void dfs(int x,int dep) { int tx=x+a[x],ty=x-a[x]; if(x==z) { ans=min(ans,dep); return ; } if(tx>0&&tx<=n&&!ok[tx]) { ok[tx]=true; dfs(tx,dep+1); } if(ty>0&&ty<=n&&!ok[ty]) { ok[ty]=true; dfs(ty,dep+1); } } int main() { memset(ok,false,sizeof(ok)); cin>>n>>q>>z; ok[q]=true; for(int i=1;i<=n;i++) { cin>>a[i]; } dfs(q,0); if(ans==INT_MAX) { cout<<-1<<endl; return 0; } cout<<ans<<endl; return 0; }
就到这了
最后
以上就是个性墨镜最近收集整理的关于【DFS】奇怪的电梯(C++)的全部内容,更多相关【DFS】奇怪内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复