【广度优先搜索BFS】奇怪的电梯

原题见上一篇博文:奇怪的电梯题目以及dfs解法

代码:

#include<bits/stdc++.h>
using namespace std;

int n,A,B,cnt,s;
int k[210];
bool b[210]={0};//标记楼层是否已经走过 
int d[2]={1,-1};//上楼加,下楼减 

struct node{
	int d;
	int step;
}a[200000],y,next;
//第一次是三个没过
//改完,第二次是2个没过
//继续改遇到瓶颈了 ,反复看了好久才发现问题在哪里,
//应该是y=a[front++],但是却写成了y.d=a[front++].d,相当于每次step都没给数值所以才会出错的啊 
int bfs(int x,int step)
{
	int front=0,rear=0;
	a[rear].d=x;
	a[rear].step=step;
	rear++; 
	b[x]=false;
	while(rear!=front){	
		y=a[front++];
		if(y.d==B) return y.step;	    
		if(y.d+k[y.d] <=n && b[y.d+k[y.d]]) {
			b[y.d+k[y.d]]=false;
			next.d=y.d+k[y.d];	
			next.step=y.step+1;
			a[rear++]=next;
		   }
		if(y.d-k[y.d]>=1 && b[y.d-k[y.d]]) {
			b[y.d-k[y.d]]=false;
			next.d=y.d-k[y.d];		
			next.step=y.step+1;
			a[rear++]=next;				
		   }
		}
    return -1;
}

int main(){
	cin>>n>>A>>B;
	memset(b,true,sizeof(b));
	for(int i=1;i<=n;i++) cin>>k[i];	
	if(A==B) cnt=0;//注意:如果当前楼层和要到达的楼层是一样的cnt=0 
	else cnt=bfs(A,0);
	cout<<cnt;
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章