代码改变世界

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

*/