目录
描述:
大楼的每一层楼都可以停电梯,而且第 i 层楼 (1≤i≤N)上有一个数字 Ki (0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。
问从 A 楼到 B 楼至少要按几次按钮?
输入描述:
输入共有二行。
第一行为三个用空格隔开的正整数,表示N,A,B (1≤N≤20 0.1≤ A,B≤N)。
第二行为N个用空格隔开的正整数,表示K我。
输出描述:
输出仅一行,即最少按键次数,若无法到达,则输出−1。
输入样例:
5 1 5
3 3 1 2 5
输出样例:
3
解题思路
本题是用bfs(广度优先搜索)来求解的最短路问题
本题只有上下两个方向,如果是迷宫类型的bfs一般为四个方向
代码
创建结构体:
struct node{
int x,y,step;
};
queue<node>q;
广搜函数:
int bfs(int x){
q.push({x,s[x],0});
v[x]=1;
int f=0;
while(!q.empty())
{
int u=q.front().x;
int u1=q.front().y;
int u2=q.front().step;
q.pop();
v[u]=1;
if(u==b){
f=1;
return u2;
}
if(u+u1<=n&&!v[u+u1]){
v[u+u1]=1;
q.push({u+u1,s[u+u1],u2+=1});
}
if(u-u1>=1&&!v[u-u1]){
v[u-u1]=1;
q.push({u-u1,s[u-u1],u2+=1});
}
}
if(!f){
return -1;
}
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
int n,a,b;
int s[205],v[205];
struct node{
int x,y,step;
};
queue<node>q;
int bfs(int x){
q.push({x,s[x],0});
v[x]=1;
int f=0;
while(!q.empty())
{
int u=q.front().x;
int u1=q.front().y;
int u2=q.front().step;
q.pop();
v[u]=1;
if(u==b){
f=1;
return u2;
}
if(u+u1<=n&&!v[u+u1]){
v[u+u1]=1;
q.push({u+u1,s[u+u1],u2+=1});
}
if(u-u1>=1&&!v[u-u1]){
v[u-u1]=1;
q.push({u-u1,s[u-u1],u2+=1});
}
}
if(!f){
return -1;
}
}
int main(){
cin>>n>>a>>b;
for(int i=1;i<=n;i++){
cin>>s[i];
}
cout<<bfs(a)<<endl;
return 0;
}