题目——奇怪的电梯(simplified BFS)
分析
这题是简化的BFS(我一遍就AC了<夸夸自己~~>),照搬之前分析BFS的思路,需要定义这些数据结构:
- 结构体position:当前位置信息,包含楼层floor和点击次数click两个int属性
- 已访问数组:bool类型数组,初始为false,表示当前楼层已经来过了(这个数组可以避免多次到达同一楼层导致click变大情况发生)
- position队列:队首即为当前所处位置,在队首出队前,需要将从队首位置能够到达的楼层全部入队
- direct数组:两个值1和-1,因为电梯只有上下两个方向,具体上下的楼层数目是题目给出的k数组
解题的答题思路就是:输入完毕后,将a楼层作为起点入队,然后BFS
代码(一遍AC,朋友们,我希望你们知道,代码一些出来就提交还能AC的含金量!<乐>)
#include <cstdio>
#include <map>
#include <string>
#include <string.h>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <limits.h>
#include <iostream>
using namespace std;
int k[300];
bool visited[300];
struct position{
int floor;
int click;
};
int direction[2]={1,-1};
queue<position> instructor;
int main(){
int n,a,b;
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++){
scanf("%d",&k[i]);
}
position start;
start.floor = a;
start.click = 0;
instructor.push(start);
visited[a]=true;
while(instructor.empty()!=true){
int current = instructor.front().floor;
if(current==b){
printf("%d\n",instructor.front().click);
return 0;
}
for(int i=0;i<2;i++){
int temp_next_floor = current + direction[i]*k[current];
if(temp_next_floor>=1&&temp_next_floor<=n&&visited[temp_next_floor]==false){
position temp;
temp.click = instructor.front().click+1;
temp.floor = temp_next_floor;
visited[temp_next_floor]=true;
instructor.push(temp);
}
}
instructor.pop();
}
printf("-1\n");
return 0;
}