解题过程:
这道题本开始就想到了深搜dfs,即一条路搜到底然后回溯,请看代码
#include<bits/stdc++.h>//万能头文件
using namespace std;
typedef long long ll;
const int N = 210;//宏定义
int k[N],d[N];
int n,a,b;//全局变量
void dfs(int layer,int step)//深搜,递归求解
{
d[layer] = step;//到达当前楼层所用的步数
int t = layer - k[layer];//中间变量表示电梯向下移动后的层数
if(t >= 1 && step + 1 < d[t]) dfs(t,step + 1);//向下后所处层数要满足大于等于1,step + 1 < d[t]即更新到达当前楼层所用的最少步数
t = layer + k[layer];//中间变量表示电梯向下移动后的层数
if(t <=n && step + 1 < d[t]) dfs(t,step + 1); //向上后所处层数要满足小于等于n ,同理
}
int main()
{
ios::sync_with_stdio(0);//iOS输入优化
cin.tie(0), cout.tie(0);//同上
cin >> n >> a >> b;//输入数据 n表示层数
for(int i=1; i<=n; i++) cin >> k[i];
memset(d,0x3f,sizeof(d));//每个字节设置为0x3f表示数为无穷大
dfs(a,0);
cout<<(d[b] == 0x3f3f3f3f ? -1 : d[b]);
return 0;
}
其实这道题也能用bfs更新,先将当前节点入队然后用当前节点更新其他节点信息,然后将当前节点出队,然后入队其他节点,以此往复。
bfs模板:
bfs()
{
queue<int> q;//初始化队列Q
while(!q.empty()) //队列不为空
{
if() //判断是否找到了目标
{
}
q.pop()//队首出队
for()
{
//依旧是四个方向
//符合条件的入队
//标记入队的点
}
}
}
接下来奉上bfs的代码希望能帮助有需要的帅哥美女们
#include<bits/stdc++.h>//万能头文件
using namespace std;
typedef long long ll;
const int N = 210;//宏定义
int k[N];
bool vis[N];
int n,a,b;
queue<pair<int,int>>q;//pair可以存两个数也可以用结构体
int bfs()
{
q.push({a,0});
vis[a] = true;
while(!q.empty())
{
int x = q.front().first,y = q.front().second;//取出队列中的数值
q.pop();//出队
if(x == b) return y;//找到答案直接返回
int xx = x + k[x],yy = y + 1;//向上
if(xx <=n && !vis[xx]) q.push({xx,yy}) ,vis[xx] = true;
xx = x - k[x];//向下
if(xx >=1 && xx <=n && !vis[xx]) q.push({xx,yy}),vis[xx] = true;
}
return -1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> a >> b;//输入数据
for(int i=1; i<=n; i++) cin >> k[i];
cout<< bfs() <<'\n';
return 0;
}
看到这篇文章的集帅集美们如果我的有错误麻烦指出,感谢各位