【廣度優先搜索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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章