A strange lift(dfs)
2019-07-26 20:32 木木王韦 阅读(103) 评论(0) 收藏 举报A strange lift
计院有一个bug电梯,可能是hyk造的,很多bug,电梯只有两个按钮,“上”和“下”,电梯每层都可以停,每层都有一个数字Ki(0<=Ki<=n),当你在一层楼,你按“上”键会到1+K1层,你按“下”键会到1-K1层。当然,电梯不能升到N以上,也不能降到1以下。例如,有一个五层楼的建筑,k1=3,k2=3,k3=1,k4=2,k5=5。从第一层开始,你可以按“上”按钮,然后你就上到第四层,如果在第一层按“下”按钮,电梯就不能做到,因为你知道它不能下到负二层。负二楼不存在。
那么,你想从A层到B层,你至少要按多少次“上”或“下”按钮呢?
Input
输入由几个测试用例组成,每个测试用例包含两行。
第一行包含三个整数n,a,b(1<=n,a,b<=200),如上文所述,第二行包含n个整数k1,k2,….kn。
单个0表示输入的结束。
Output
对于每种情况下的输入输出一个整数,当你在A层,你必须按下按钮的最少次数,你想去B层。如果你不能到达B层,打印“-1”。
Sample Input
5 1 5
3 3 1 2 5
0
Sample Output
3
事实证明dfs会超时,所以需要bfs
超时的dfs代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int vis[205];
int d[205];
int n,a,b,flag,ans;
void dfs(int x,int step){
//cout<<" "<<x<<"step:"<<step<<endl;
if(x==b){
flag=1;
ans=step;
return;
}
if(!vis[x]&&x+d[x]>0&&x+d[x]<=n){
vis[x]=1;
//cout<<x<<"step+:"<<step<<endl;
dfs(x+d[x],step+1);
vis[x]=0;
}
if(!vis[x]&&x-d[x]>0&&x-d[x]<=n){
vis[x]=1;
//cout<<x<<"step-:"<<step<<endl;
dfs(x-d[x],step+1);
vis[x]=0;
}
//cout<<"step"<<step<<endl;
return;
}
int main(){
while(cin>>n&&n){
cin>>a>>b;
memset(vis,0,sizeof(vis));
flag=0;
ans==0x3f3f3f3f;
for(int i=1;i<=n;i++){
cin>>d[i];
}
dfs(a,0);
if(!flag) cout<<"-1"<<endl;
else cout<<ans<<endl;
}
return 0;
}
/*
5 1 5
3 3 1 2 5
5 2 5
3 1 2 2 3
6 3 6
2 4 1 3 4 3
*/
ac的bfs代码:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
struct haha{
int n,step;
};
int vis[205];
int d[205];
int n,a,b,flag,ans;
void bfs(int x,int step){
queue<haha> que;
haha e1,e2;
e1.n =x;
e1.step =0;
que.push(e1);
vis[x]=1;
while(!que.empty()){
e1=que.front();
que.pop();
// cout<<"x:"<<e1.n <<endl;
if(e1.n ==b){
ans=e1.step ;
flag=1;
break;
}
// cout<<"***"<<endl;
for(int i=0;i<2;i++){
if(i==0){
e2.n =e1.n +d[e1.n ];
// cout<<"加"<<e2.n <<endl;
if(!vis[e2.n ]&&e2.n >0&&e2.n <=n){
// cout<<e2.n <<endl;
vis[e2.n ]=1;
//cout<<x<<"step+:"<<step<<endl;
e2.step =e1.step +1;
que.push(e2);
}
}
else{
// cout<<"减"<<e2.n <<endl;
e2.n =e1.n -d[e1.n ];
if(!vis[e2.n ]&&e2.n >0&&e2.n <=n){
//cout<<e2.n <<endl;
vis[e2.n ]=1;
//cout<<x<<"step+:"<<step<<endl;
e2.step =e1.step +1;
que.push(e2);
}
}
}
}
}
int main(){
while(cin>>n&&n){
cin>>a>>b;
memset(vis,0,sizeof(vis));
flag=0;
ans==0x3f3f3f3f;
for(int i=1;i<=n;i++){
cin>>d[i];
}
bfs(a,0);
if(!flag) cout<<"-1"<<endl;
else cout<<ans<<endl;
}
return 0;
}
/*
5 1 5
3 3 1 2 5
5 2 5
3 1 2 2 3
6 3 6
2 4 1 3 4 3
*/
浙公网安备 33010602011771号